JsonPath实战

概述

JsonPath,GitHub是一种简单的方法来提取给定JSON文档的部分内容,提供类似正则表达式的语法来解析JSON文档。

特性

入门

引入如下Maven依赖:

<dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId>
</dependency>

基本使用:

JsonPath.read("", "");

需要传入两个String类型的参数,第一个参数为一个JSON String,第二个参数为JsonPath表达式。对应的源码为:

public static <T> T read(String json, String jsonPath, Predicate... filters) {return (new ParseContextImpl()).parse(json).read(jsonPath, filters);
}

第三个参数Predicate,表示谓词,在进阶部分会详细讲解。

查看com.jayway.jsonpath.JsonPath源码,不难发现,第一个参数可以替换成Object、File、URL、InputStream类型的JSON,即可以直接读取一个JSON文件或网络资源等。

返回类型可以是用泛型定义的任意对象(<T> T),也可以是一个DocumentContext(用得不多,可以直接忽略)。

JsonPath表达式

从上面的简介,不难得知,使用好JsonPath的基础条件是熟悉JsonPath表达式:

  • JsonPath中的根成员对象始终称为$,无论是对象JSON Object还是数组JSON Array
  • JsonPath表达式支持点表示法
  • 也支持括号表示法,繁琐,不建议使用
  • 解析JSON Array时,支持数组表示法,索引从0开始
  • 数组表示法,和Python 数组语法几乎没有差别
  • *表示所有节点
  • ..表示选择所有符合条件的节点
  • ?()表示过滤操作
  • @表示当前节点

如何校验JsonPath表达式的合法性呢?

JsonPath.compile("$..");

在这里插入图片描述
使用IDEA的话,编译器会给出warning,执行mvn compile可以成功。运行这一行代码,JsonPath给出报错:InvalidPathException: Path must not end with a '.' or '..'

函数支持

函数可以在路径的尾部调用,函数的输出是路径表达式的输出,该函数的输出是由函数本身所决定的。

函数描述输出
min()返回数值类型数组的最小值Double
max()返回数值类型数组的最大值Double
avg()返回数值类型数组的平均值Double
stddev()返回数值类型数组的标准偏差值Double
length()返回数值类型数组的长度Integer

过滤器运算符

?(),表示过滤器,用于筛选数组的逻辑表达式。一个典型的过滤器将是[?(@.age > 18)]@表示正在处理的当前项目。可使用逻辑运算符&&||来创建更复杂的过滤器。字符串文字必须用单引号或双引号括起来:[?(@.color == 'blue')][?(@.color == "blue")]

操作符描述
==left等于right(注意1不等于’1’)
!=不等于
<小于
<=小于等于
>大于
>=大于等于
=~匹配正则表达式[?(@.name =~ /foo.*?/i)]
in左边存在于右边 [?(@.size in [‘S’, ‘M’])]
nin左边不存在于右边
size数组或字符串长度
empty数组或字符串为空

实战

示例JSON文档:

{"store": {"book": [{"category": "reference","author": "Nigel Rees","title": "Sayings of the Century","price": 8.95},{"category": "fiction","author": "J. R. R. Tolkien","title": "The Lord of the Rings","isbn": "0-395-19395-8","price": 22.99}],"bicycle": {"color": "red","price": 19.95}},"expensive": 10
}

很简单的一个JSON文档,有两个键值对,其中store表示商场,卖book和bicycle;expensive=10。

$.store.book[0].title表示获取第一本书的标题,测试代码:

log.info(JsonPath.read(jsonStr, "$.store.book[0].title"));

输出:Sayings of the Century

使用括号表示法,$['store']['book'][0]['title'],输出同样是Sayings of the Century

$..book.length()表示获取book这个Array的个数,输出2,测试代码略。

$..book[0,1]表示获取第一、二两本书。
$..book[-2:]表示获取最后两本书。
$..book[:1]表示获取从索引0开始的书籍,索引1不算在内。
$..book[1:2]表示获取从索引1开始的书籍,索引2不算在内。
$..book[1:]表示获取第二本(索引1开始)到最后一本书。

$.store.book[*].author表示获取所有book的作者,输出是一个列表。使用..的话,$..author也表示获取所有作者,输出列表。

$..book[?(@.isbn)]表示获取JSON中book Array里包含isbn编号的书。

$.store.book[?(@.isbn)].author表示获取JSON中book Array里包含isbn编号的书的作者。

$.store.book[?(@.price < 10)]表示获取JSON中book Array里售价低于10的书。

$..book[?(@.price < $['expensive'])]表示获取JSON中book Array里售价低于expensive的书。

支持的常用表达式

JsonPath描述
$根节点
@当前节点
.or[]子节点
..选择所有符合条件的节点
*所有节点
[]迭代器标示,如数组下标
[,]支持迭代器中做多选
[start:end:step]数组切片运算符
?()支持过滤操作
()支持表达式计算

进阶

Exception

以json-path-2.9.0版本为例,共定义8个Exception:

  • InvalidCriteriaException
  • InvalidJsonException
  • InvalidModificationException
  • InvalidPathException
  • JsonPathException
  • PathNotFoundException
  • ValueCompareException
  • EvaluationAbortException
  • MappingException
    在这里插入图片描述

谓词

谓词,谓语,也有翻译成断言的,即Predicate,JsonPath中的过滤器谓词有三种:

  • 内联谓词
  • 过滤器谓词
  • 自定义谓词

内联谓词

List<Map<String, Object>> books =  JsonPath.parse(json).read("$.store.book[?(@.price < 10)]");

可使用&&||结合多个谓词[?(@.price < 10 && @.category == 'fiction')]。使用!否定一个谓词[?(!(@.price < 10 && @.category == 'fiction'))]

过滤谓词

使用Filter API构建:

import static com.jayway.jsonpath.JsonPath.parse;
import static com.jayway.jsonpath.Criteria.where;
import static com.jayway.jsonpath.Filter.filter;
Filter filter = filter(where("category").is("fiction").and("price").lte(10D)
);
List<Map<String, Object>> books = parse(json).read("$.store.book[?]", filter);

占位符?为路径中的过滤器。当提供多个过滤器时,它们按照占位符数量与提供的过滤器数量相匹配的顺序应用。可以在一个过滤器操作[?, ?]中指定多个谓词占位符,这两个谓词都必须匹配。

过滤器也可以与ORAND一起使用

Filter fooOrBar = filter(where("foo").exists(true)).or(where("bar").exists(true));
Filter fooAndBar = filter(where("foo").exists(true)).and(where("bar").exists(true));

自定义谓词

Predicate booksWithIsbn = new Predicate() {@Overridepublic boolean apply(PredicateContext ctx) {return ctx.item(Map.class).containsKey("isbn");}
};
List<Map<String, Object>> books = reader.read("$.store.book[?].isbn", List.class, booksWithIsbn);

Configuration

Option

源码为com.jayway.jsonpath.Option,枚举类:

  • DEFAULT_PATH_LEAF_TO_NULL:当检索不到时返回null对象,否则如果不配置这个,会直接抛出异常PathNotFoundException
  • ALWAYS_RETURN_LIST:总是返回list,即便是一个确定的非list类型,也会被包装成list
  • AS_PATH_LIST:返回path
  • SUPPRESS_EXCEPTIONS:不抛出异常,需要判断如下:
    • ALWAYS_RETURN_LIST开启,则返回空list
    • ALWAYS_RETURN_LIST关闭,则返回null
  • REQUIRE_PROPERTIES:如果设置,则不允许使用通配符,比如$[*].b会抛出PathNotFoundException异常。

SPI

SPI是
在这里插入图片描述

cache

对应于源码

json

mapper

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2978857.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Python 采集京东手机商品标题,价格,评论,商品图片等

这段Python代码主要用于从京东网站的搜索结果页面抓取关于手机商品的信息&#xff0c;包括商品标题&#xff0c;价格&#xff0c;评论数以及商品图片的链接。 代码都测试验证过都能正常跑通&#xff0c;实现效果&#xff0c;由于各大网站防爬机制随时可能更新&#xff0c;代码…

C++之类和对象--赋值运算符重载和const成员函数

目录 1.赋值运算符重载 1.1运算符重载 1.2赋值运算符重载 1.3其它特性 2.const成员函数 3.取地址及const取地址操作符重载 hello&#xff0c;欢迎大家来到小恶魔频道&#xff0c;今天讲解的是C里面的赋值运算符重载以及const成员函数 1.赋值运算符重载 1.1运算符重载 运…

python_django中小学家校互动系统vue_flask家校联系

实现了一个完整的家校互动系统&#xff0c;其中主要有作业信息模块、学校管理员模块、学生学籍模块、学生成绩模块、学科模块、系统新闻模块、系统公告模块、校内新闻模块、校内公告模块、用户表模块、token表模块、关于我们模块、收藏表模块、年级模块、家长模块、教师模块、互…

24V转2.8V2A降压芯片WT6030

24V转2.8V2A降压芯片WT6030 WT6030是一种高效同步整流降压开关模式转换器&#xff0c;集成内部功率MOSFET。该器件在宽输入电源范围内提供3A峰值输出电流&#xff0c;展现出卓越的负载和线路调节性能。其设计仅需要最小数量的外部现成组件&#xff0c;并且采用了节省空间的ESO…

【Linux系统编程】第七弹---权限管理操作(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、修改文件权限的做法(一) 2、有无权限的表现 总结 上一弹我们讲解了Linux权限概念相关的知识&#xff0c;但是我们只知道有…

相机1:如何系相机肩带

开始解锁新领域&#xff0c;多看几个相关视频&#xff0c;大概也就可以掌握一两种系相机肩带的方法&#xff0c;本质就是新知识的学习过程&#xff0c;不可能等着或者期待出来一个完整的教程&#xff0c;一步一步自己去探索&#xff0c;自己去查资料。 目录 总述 第一步&#…

DSP系统的设计过程与选型

DSP的设计步骤分几个阶段&#xff0c;应用系统的设计过程如图所示。 技术指标的确定 器件的选型原则 其他因素的考虑

RTT学习 MQTT

MQTT背景应用 MQTT是机器对机器&#xff08;M2M&#xff09;/物联网&#xff08;IoT&#xff09;连接协议&#xff0c;它是专为受限设备和低带宽、高延迟或不可靠的网络而设计的&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的“轻量级”通讯…

【C语言】每日一题,快速提升(10)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;圣诞树 输入&#xff1a; 1输出&#xff1a; * * * * * **说明&#xff1a; 输入&#xff1a; 2输出&#xff1a; * * * * * * * …

【Elasticsearch】Elasticsearch 从入门到精通(一):基本介绍

《Elasticsearch 从入门到精通》共包含以下 2 2 2 篇文章&#xff1a; Elasticsearch 从入门到精通&#xff08;一&#xff09;&#xff1a;基本介绍Elasticsearch 从入门到精通&#xff08;二&#xff09;&#xff1a;基础使用 &#x1f60a; 如果您觉得这篇文章有用 ✔️ 的…

FIR补偿滤波器——matlab的FDA实现

输入采样频率&#xff1a;192KHz 抽取倍数&#xff1a;2 通带截至频率&#xff1a;20KHz 通带衰减&#xff1a;0.1dB 阻带衰减&#xff1a;120dB 在更多选项那里&#xff0c;设置c为0.5&#xff0c;代表抽取倍数为1/c&#xff0c;p设置为4&#xff0c;代表级联阶数。FIR补偿…

3.SpringCloud版本

1.SpringCloud与SpringBoot之间版本对应 2.服务拆分的注意事项 1.不同微服务&#xff0c;不要重复开发相同业务。 2.微服务的数据独立&#xff0c;每个微服务都有自己独立的数据库&#xff0c;不要访问其他微服务的数据库。 3.微服务可以将自己的的业务暴露为接口&#xff…

中电金信:向“新”而行——探索融合架构的项目管理在保险行业的应用

近年来&#xff0c;险企在政策推动、市场牵引、自身发展、新技术应用日趋成熟等内外部因素的驱动下&#xff0c;积极投身到数字化转型的浪潮中。在拜访各类保险客户和合作项目的过程中&#xff0c;我们发现不少险企在数字化转型中或多或少都面临着战略如何落地、技术如何承接和…

国外问卷调查如何做?需要借助海外住宅IP吗?

在数字化时代&#xff0c;国外问卷调查不仅是了解市场需求的重要手段&#xff0c;还成为了一项能够赚取额外收入的方式。随着全球范围内消费者行为的多样化&#xff0c;各类企业和机构越来越需要了解不同地区的用户观点和偏好&#xff0c;以优化产品和服务。 一、国外问卷调查…

【HarmonyOS】Stage 模型 - 基本概念

一、项目结构 如图1所示&#xff1a; 图1 从项目结构来看&#xff0c;这个应用的内部包含了一个子模块叫 entry&#xff0c;模块是应用的基本功能单元&#xff0c;它里面包含源代码、资源、配置文件等。 像这样的模块在应用内部可以创建很多。但模块整体来讲就分成两大类&am…

Ghost Buster Pro for Mac:强大的系统优化工具

Ghost Buster Pro for Mac是一款功能强大的系统优化工具&#xff0c;专为Mac用户设计&#xff0c;旨在提供全方位的系统清理、优化和维护服务。 Ghost Buster Pro for Mac v3.2.5激活版下载 这款软件拥有出色的垃圾清理能力&#xff0c;能够深度扫描并清除Mac上的无效目录、文件…

(C++) 树状数组

目录 一、介绍 二、一维树状数组 2.1 区间长度 2.2 前驱和后继 2.3 查询前缀和 2.4 点更新 三、一维数组的实现 3.1 区间长度函数 3.2 前缀和 3.3 插入/更新 3.4 封装成类 一、介绍 树状数组&#xff08;Binary Indexed Tree&#xff0c;BIT&#xff09;&#xff0c;又称为 …

基于MLP算法实现交通流量预测(Pytorch版)

在海量的城市数据中&#xff0c;交通流量数据无疑是揭示城市运行脉络、洞察出行规律的关键要素之一。实时且精准的交通流量预测不仅能为交通规划者提供科学决策依据&#xff0c;助力提升道路使用效率、缓解交通拥堵&#xff0c;还能为公众出行提供参考&#xff0c;实现个性化导…

【软件测试】认识测试|测试岗位|软件测试和开发的区别|优秀的测试人员需要具备的素质

一、什么是测试 测试在⽣活中处处可⻅ 1.生活中的测试场景 案例⼀&#xff1a;对某款购物软件进⾏测试 *启动测试&#xff1a;点击软件图标&#xff0c;测试软件是否可以正常打开 搜索测试&#xff1a;点击输入框&#xff0c;输入关键词&#xff0c;点击搜索 商品测试&#…

Web3革命:区块链如何重塑互联网

引言 互联网的发展已经深刻地改变了我们的生活方式&#xff0c;而现在&#xff0c;Web3和区块链技术正在为我们提供一个全新的数字世界的视角。本文将带你深入了解Web3的核心概念、技术特性以及它如何正在重塑我们的互联网体验。 从Web1.0到Web3&#xff1a;数字革命的演进 W…