一、简要概述
- JsonPath用于读取JSON文档,使用起来很方便。通过前段时间项目开发过程中,针对于特定的场景来使用这款解析神器。给我的直观感受就是:使用JsonPath来检索JSON数据中指定的字段值效率还是很快的。
二、JsonPath知识学习
- 运算器语法如下所示
运算符 | 描述 |
---|---|
$ | 要查询的根元素。这将启动所有路径表达式。 |
@ | 过滤谓词正在处理的当前节点。 |
… | 深层扫描。可在任何需要名称的地方使用。 |
.<名字> | 点出当前节点的下级子节点 |
[’<名字>’ (, ‘<名字>’)] | 要查询的根元素。这将启动所有路径表达式。 |
[<数字> (, <数字>)] | 要查询的根元素。这将启动所有路径表达式。 |
[start:end] | 数组切片运算符 |
[?(<表达式>)] | 过滤表达式。表达式必须计算为布尔值。 |
- 函数语法如下所示
函数 | 描述 | 输出 |
---|---|---|
min() | 提供数字数组的最小值 | Double |
max() | 提供数字数组的最大值 | Double |
avg() | 提供数字数组的平均值 | Double |
stddev() | 提供数字数组的标准偏差值 | Double |
length() | 提供数组的长度 | Integer |
sum() | 提供数字数组的总和 | Double |
keys() | 提供属性键(终端波浪号的替代方法~) | Set |
- 过滤运算符语法如下所示
运算符 | 描述 |
---|---|
== | 左等于右(请注意1不等于“ 1”) |
!= | 左不等于右 |
< | 左小于右 |
<= | 左小于或等于右 |
> | 左大于右 |
> = | 左大于或等于右 |
=〜 | left匹配正则表达式[?(@。name =〜/foo.*?/i)] |
in | 左存在于右[?(@.size in [‘S’, ‘M’])] |
nin | 左不存在于右 |
subsetof | 左是右的子集[?(@.sizes subsetof [‘S’, ‘M’, ‘L’])] |
anyof | 左与右有一个相交[?(@.sizes anyof [‘M’, ‘L’])] |
noneof | 左与右没有一个相交[?(@.sizes noneof [‘M’, ‘L’])] |
size | 左(数组或字符串)的大小应与右匹配 |
empty | 左边(数组或字符串)应为空 |
- JSON数据样例
{
“ store”:{
“ book”:[
{
“ category”:“参考” ,
“ author”:“ Nigel Rees” ,
“ title”:“世纪风云” ,
“ price”:8.95
} ,
{
“ category “:‘小说界’ ,
‘作家’:‘伊夫林沃’ ,
‘称号’:‘荣誉之剑’ ,
‘价格’:12。99
} ,
{
“ category”:“小说” ,
“ author”:“ Herman Melville” ,
“ title”:“ Moby Dick” ,
“ isbn”:“ 0-553-21311-3” ,
“ price”:8.99
} ,
{
“ category”:“小说” ,
“ author “:” JRR Tolkien“ ,
” title“:”指环王“ ,
” isbn“:” 0-395-19395-8“ ,
” price“:22.99
}
] ,
”自行车” :{
“颜色”:“红色” ,
“价格”:19.95
}
} ,
“昂贵”:10
}
JsonPath表达式 | 结果 |
---|---|
$ .store.book [*].author | 所有书籍的作者 |
$ …author | 所有作者 |
$ .store。* | 所有东西,包括书籍和自行车 |
$ .store…price | 一切的价格 |
$ … book [2] | 第三本书 |
$ … book [-2] | 倒数第二本书 |
$ … book [0,1] | 前两本书 |
$ … book [:2] | 从索引0(含)到索引2(不含)的所有图书 |
$ … book [1:2] | 从索引1(含)到索引2(不含)的所有图书 |
$ … book [-2:] | 最后两本书 |
$ … book [2:] | 第二本书从尾 |
$ … book [?(@。isbn)] | 所有带有ISBN编号的图书 |
$ .store.book [?(@。price <10)] | 商店中所有书籍的价格均低于10 |
$ … book [?(@。price <= $ [‘expensive’])] | 商店中所有非“昂贵”的图书 |
$ … book [?(@。author =〜/.*REES/i)] | 所有与正则表达式匹配的书籍(忽略大小写) |
$ … * | 把所有东西都给我 |
$ … book.length() | 书数 |
三、JsonPath入门
- 强烈推荐学习者可以在学习JsonPath知识的同时,利用在线JSONPath测试进行实操运用。
- 我在这里说一下idea中如何使用JsonPath引擎来进行解析JSON数据。
(1)pom文件引入JsonPath依赖库
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.5.0</version>
</dependency>
(2)代码中对json字符串进行解析
String json = "...";
List<String> authors = JsonPath.read(json, "$.store.book[*].author");
(3)回写上下文(有需要的朋友可以参考)
if ("Y".equals(expr_write_back_ctx)) {
context.put(expr_code, result);
}