Jayway JsonPath-提取JSON文档内容的Java DSL
介绍
JsonPath是一种能够提取部分JSON文档属性、对象、数组的语法,支持条件过滤、数学运算、字符串处理等功能。JsonPath与JSON文档就像 XPath 表达式与 XML 文档结合使用一样。
由于 JSON 结构通常是匿名的,并不一定和XML一样具有“根成员对象”,因此 JsonPath假定分配$给外层对象的抽象名称。JsonPath由用点分隔的表达式段(操作符)组成。 操作符可以是一个简单的词,如 JSON 值名称、*,也可以是括在方括号 [ ] 中的更复杂的构造。 括号段前的分隔点是可选的,也可以省略。下面是几种JsonPath的提取JSON文档内容语法:
| JsonPath | 描述 |
|---|---|
| $.object.name | 返回object.name的内容。 |
| $.object['name'] | 返回object.name的内容。 |
| $.object.['name'] | 返回object.name的内容。 |
| $.object.history.length() | 返回object.history数组元素的个数。 |
| $[?(@.name == 'Object')].price.first() | 返回第一个名为'Object'的对象的价格字段。 |
| $[?(@.price > 10)].length() | 返回price大于10的对象个数。 |
Jayway JsonPath是Stefan Goessner JsonPath的Java实现,是用于读取JSON文档的Java DSL。本文主要通过Jayway JsonPath来简单介绍JsonPath的使用语法,通过真实报文案例来进行操作。
支持的操作符
| 操作符 | 描述 |
|---|---|
| ` | 操作符 |
| --- | --- |
| 查询的根节点对象,表示一个json的数据,可以是对象或数组 | |
@ |
当前节点对象 |
* |
通配符,获取所有节点 |
.. |
递归查找,查找所有层次的属性值 |
<name> |
按名称匹配对象属性。 |
.<name> |
按照名称查找子节点 |
['<name>','<name>',...] |
可用查找多个节点 |
[<number>,<number>,...] |
按索引匹配数组元素,可同时查找多个数组元素 |
[start:end] |
按定义的范围匹配数组元素: |
<start>- 要匹配的第一个索引(包括)。 如果未指定,则匹配从头开始的所有数组元素。 如果为负数,则指定从数组末尾开始的偏移量。
<end>- 要匹配的最后一个索引(不包括)。 如果未指定,则匹配所有数组元素到最后。 如果为负数,则指定从数组末尾开始的偏移量。 | | [?(<expression>)] | 过滤表达式可匹配对象/数组元素,表达式的结果必须为布尔值 |
可以通过在 JSONPath 中添加 ~ 后缀来提取匹配的元素名称。 它返回匹配对象的名称或匹配数组项的字符串格式的索引。
过滤操作符
| 操作符 | 描述 |
|---|---|
| == | 等于 |
| != | 不等于 |
| < | 小于 |
| <= | 小于或等于 |
| > | 大于 |
| >= | 大于或等于 |
| =~ | 匹配正则表达式 [?(@.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 | 左侧(数组或字符串)应该为空 |
支持的函数
可以在JsonPath表达式执行后进行调用,其输入值为表达式的结果。函数的输出看具体某个函数的含义。
| 函数 | 描述 | 返回值类型 |
|---|---|---|
| min() | 数值类型数组最小值 | Double |
| max() | 数值类型数组最大值 | Double |
| avg() | 数值类型数组平均值 | Double |
| stddev() | 数值类型数组标准差 | Double |
| length() | 数组长度 | Integer |
| sum() | 数值类型数组求和 | Double |
| keys() | 提取匹配的元素名称与~操作符功能一致 |
Set<E> |
| concat(X) | 拼接 | 与入参相同 |
| append(X) | 把元素添加到JsonPath输出的数组中 | 与入参相同 |
| first() | 数组中的第一个元素 | 数组中元素类型 |
| last() | 数组中的最后一个元素 | 数组中元素类型 |
| index(X) | 提供索引为X的数组的元素,如果X为负数,则从后往前取 | 数组中元素类型 |
用一个复杂的接单报文来演示
https://jsonpath.com,这个在线网站可以用来验证JsonPath表达式,但是不支持函数,函数可以通过java代码来验证。
String json ="{.....}";
Object read = JsonPath.read(json, "$..price.min()");
System.out.println(read);
示例报文
{
"address":"大良街道同兴路****",
"createTime":"2023-09-20 17:48:44",
"customerName":"培^_^",
"id":0,
"memberId":"ECP002000*****",
"mobile":"184^_^8547",
"extendMessage":{
"clientNo":"testEBU516154",
"clientName":"广州网络科技有限公司",
"spSoNo":"test1976065878296",
"road":"011"
},
"odOrderDetailList":[
{
"id":1,
"productName":"白医生中频针灸理疗仪家用医院医用多功能颈椎肩周炎腰肌劳损电疗经络激光低频按摩器同款中频激光综合治疗仪 2023新款",
"quantity":1,
"productSku":"38fjjjj",
"price":189.6
},
{
"id":2,
"productName":"测试SKU",
"quantity":3,
"productSku":"ESG03JJ1",
"price":200
}
],
"totalPrice":0,
"volume":17318.4,
"extendInfo":{
"templateInfo":[
{
"code":"TP123",
"isPrint":1,
"type":2,
"printType":0
},
{
"code":"TPABC",
"isPrint":1,
"type":4,
"printType":0
}
],
"attrs":{
"plateFormCode":"274"
},
"senderName":"流苏",
"senderAddress":"广东省中山市南头镇永辉北路*****",
"paymentTime":"2023-09-20 17:22:31"
},
"carrierName":"京东配送",
"provinceName":"广东",
"isConsumable":0,
"merchantType":"0",
"tags":[
"a",
"b",
"c",
"d",
"e"
]
}
操作结果
| JsonPath | 结果 |
|---|---|
| $.extendMessage.clientName | "广州网络科技有限公司" |
| $.extendMessage['clientNo'] | "testEBU516154" |
| $.extendMessage | {"clientNo":"testEBU516154","clientName":"广州网络科技有限公司","spSoNo":"test1976065878296","road":"011"} |
| $.odOrderDetailList[0].productName | "白医生中频针灸理疗仪家用医院医用多功能颈椎肩周炎腰肌劳损电疗经络激光低频按摩器同款中频激光综合治疗仪 2023新款" |
| $.odOrderDetailList[-1].productName | "测试SKU" |
| $.odOrderDetailList.length() | 2 |
| $.tags[:] | ["a", "b", "c", "d", "e" ] |
| $.tags[2:] | ["c", "d", "e" ] |
| $.tags[:3] | ["a", "b", "c"] |
| $.tags[1:4] | ["b", "c", "d"] |
| $.tags[-2:] | ["d", "e"] |
| $.tags[:-3] | ["a", "b"] |
| $.tags[:-3].length() | 2 |
| $.odOrderDetailList[0,1].productName | "白医生中频针灸理疗仪家用医院医用多功能颈椎肩周炎腰肌劳损电疗经络激光低频按摩器同款中频激光综合治疗仪 2023新款", "测试SKU" |
| $.odOrderDetailList[1].[productName,price] | "测试SKU", 200 |
| $..id | 0,1,2 |
| $.odOrderDetailList[?(@.id == 4 - 0.4 * 5)].productSku | "ESG03JJ1" |
| $.odOrderDetailList[?(@.id == 1 | |
| $.extendInfo.templateInfo[?(!(@.type == 2))].code | "TPABC" |
| $.extendInfo.templateInfo[?((@.type != 2))].code | "TPABC" |
| $.odOrderDetailList[?(@.price > 190)].productName | "测试SKU" |
| $.odOrderDetailList[?(@.id> $.id)].productSku | ["38fjjjj","ESG03JJ1"] |
| $..[?(@.productSku)] | [{"id":1,"productName":"白医生中频针灸理疗仪家用医院医用多功能颈椎肩周炎腰肌劳损电疗经络激光低频按摩器同款中频激光综合治疗仪 2023新款","quantity":1,"productSku":"38fjjjj","price":189.6},{"id":2,"productName":"测试SKU","quantity":3,"productSku":"ESG03JJ1","price":200}] |
| $..tags.length() | 5 |
| $.odOrderDetailList[*].price.min() | 189.6 |
| $..price.max() | 200 |
作者:京东物流 马红岩
来源:京东云开发者社区 自猿其说 Tech 转载请注明来源
Jayway JsonPath-提取JSON文档内容的Java DSL的更多相关文章
- 不规范的json文档 转化成 java 对象的处理
最近练习爬取数据,遇到了json文档中属性名称没有用双引号的情况,内容如下: 标准的json文档,属性名称都是带双引号的 最后写了个方法,替换属性名字 为 两头追加双引号的属性名字, 特别要注意,防止 ...
- 一个SQLServer中JSON文档型数据的查询问题
近日在项目中遇到一个问题: 如何在报表中统计JSON格式存储的数据? 例如有个调查问卷记录表,记录每个问题的答案. 其结构示意如下(横表设计) Id user date Q1_Answer Q2_An ...
- java操作office和pdf文件java读取word,excel和pdf文档内容
在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...
- C#提取TXT文档指定内容
早上有分享一篇<VB.NET提取TXT文档指定内容> http://www.cnblogs.com/insus/p/3267347.html 那是原网友的需求用VB.NET写的.刚才有只懂 ...
- python、java、ruby、node等如何提取office文档中的内容?
我相信大家都有过这样的需求,把doc.ppt.excel.pdf.txt中的文本内容提取出来.提取出来的文本内容可用于文档内容的全文索引,文档的基本内容摘要等.在度娘上搜索“如何提取文档内容”,确实有 ...
- Collection+JSON 文档
Collection+JSON 文档 对于这个设计,我们不再以可能的状态和转移为起点,相反,我们将从一个集合状态响应中可能元素的顶层布局开始.从这一点入手,其他细节可以随着设计向超媒体类型最底层属性的 ...
- 使用DOM4J解析XML文档,以及使用XPath提取XML文档
使用DOM4J解析XML文档 需要首先下载DOM4J工具包.这是个第三方工具包 在使用DOM4J解析的时候需要导入 DOM4J的JAR包 下载DOM4J工具包->在MyEclipse中新建lib ...
- 使用Java POI来选择提取Word文档中的表格信息
通过使用Java POI来提取Word(1992)文档中的表格信息,其中POI支持不同的ms文档类型,在具体操作中需要注意.本文主要是通过POI来提取微软2003文档中的表格信息,具体code如下(事 ...
- QJsonDocument实现Qt下JSON文档读写
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QJsonDocument实现Qt下JSON文档读写 本文地址:http://tech ...
- package.json文档
之前在博客中写过一篇关于 " node.js的安装配置 " 的文章,里面有提到利用 gulp watch 来监听文档的变化.其中需要 package.json 文件才能实现效果,所 ...
随机推荐
- 后缀数组C++详解
后缀定义 "后缀i"代表以第i个字符开头的后缀,存储是用i代表字符串s的后缀s[i...n] 后缀数组是什么? 后缀数组(Suffix Array)主要关系到两个数组:sa 和 r ...
- SpringCloudAlibaba框架学习
遇到问题找了各种办法都没有解决,就reload maven,再不行就重启idea,重启电脑.(有奇效,我好几次就这么解决的,可能是我电脑配置太拉了) 注册中心 - Nacos 配置文件优先级:本地配置 ...
- [信友队图灵杯中级组-D]基础循环结构练习题
2023-5-13 题目 题目传送门 难度&重要性(1~10):6.5 题目来源 信友队图灵杯 题目算法 构造 解题思路 我们可以知道,在一开始我们得到的 \(a\) 数组是 \(1,2,3, ...
- 千万级数据深分页查询SQL性能优化实践
一.系统介绍和问题描述 如何在Mysql中实现上亿数据的遍历查询?先来介绍一下系统主角:关注系统,主要是维护京东用户和业务对象之前的关注关系:并对外提供各种关系查询,比如查询用户的关注商品或店铺列表, ...
- 快速了解C#接口(Interface)
Runoob 接口定义了所有类继承接口时应遵循的语法合同.接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分. 接口定义了属性.方法和 ...
- @Async注解详解 以及 可能遇到的各种问题
一.简介1)在方法上使用该@Async注解,申明该方法是一个异步任务:2)在类上面使用该@Async注解,申明该类中的所有方法都是异步任务:3)方法上一旦标记了这个@Async注解,当其它线程调用这个 ...
- 使用Springboot+SpringCloud+Seata1.3.0+Nacos1.2.1进行全局事务管理
一.官方文档网址 http://seata.io/zh-cn/docs/overview/what-is-seata.html Seata1.3.0开发组提供的开发文档 二.常见问题 2.1:网址: ...
- 树莓派4b装系统到运行 Blazor Linux 本地程序全记录
在Linux下运行gui程序,咱也是第一次做,属于是瞎子过河乱摸一通,写得有什么不对和可以优化的地方,希望各位看官斧正斧正. 1. 下载烧录器 https://www.raspberrypi.com/ ...
- 教你用API插件开发一个AI快速处理图片小助手
本文分享自华为云社区<[案例教学]华为云API图引擎服务 GES的便捷性-AI帮助快速处理图片小助手>,作者:华为云PaaS服务小智. 调用云服务.API.SDK.调试.查看-- &quo ...
- python第一章 学习笔记 计算机基础知识 Sublime Text 3
## 计算机是什么 在现实生活中,越来越无法离开计算机了 电脑.笔记本.手机.游戏机.汽车导航.智能电视 ... 计算机就是一个用来计算的机器! 目前来讲,计算机只能根据人类的指令来完成各种操作,人让 ...