您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
Jayway JsonPath-提取JSON文档内容的Java DSL
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
Jayway JsonPath-提取JSON文档内容的Java DSL
15230106379_p
2023-11-21
IP归属:北京
120浏览
# 介绍 --------- 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](https://github.com/json-path/JsonPath) 是 [Stefan Goessner JsonPath](http://goessner.net/articles/JsonPath/)的Java实现,是用于读取JSON文档的Java DSL。本文主要通过Jayway JsonPath来简单介绍JsonPath的使用语法,通过真实报文案例来进行操作。 # 支持的操作符 --------- | 操作符 | 描述 | | :------------------------ | :----------------------------------------------------------------- | | `$` | 查询的根节点对象,表示一个json的数据,可以是对象或数组 | | `@` | 当前节点对象 | | `*` |通配符,获取所有节点 | | `..` |递归查找,查找所有层次的属性值 | | `<name>` | 按名称匹配对象属性。 | | `.<name>` | 按照名称查找子节点 | | `['<name>','<name>',...]` | 可用查找多个节点 | | `[<number>,<number>,...]` |按索引匹配数组元素,可同时查找多个数组元素 | | `[start:end]` | 按定义的范围匹配数组元素:</br>`<start>` - 要匹配的第一个索引(包括)。 如果未指定,则匹配从头开始的所有数组元素。 如果为负数,则指定从数组末尾开始的偏移量。</br>`<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](https://jsonpath.com),这个在线网站可以用来验证JsonPath表达式,但是不支持函数,函数可以通过`java`代码来验证。 ```java String json ="{.....}"; Object read = JsonPath.read(json, "$..price.min()"); System.out.println(read); ``` ## 示例报文 ```json { "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 \|\| @.id == 2)].productSku |"38fjjjj", "ESG03JJ1" | |$.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 |
上一篇:Promise规范与原理解析
下一篇:时间复杂度为 O(nlogn) 的排序算法
15230106379_p
文章数
2
阅读量
332
作者其他文章
01
拆解雪花算法生成规则
1 介绍雪花算法(Snowflake)是一种生成分布式全局唯一ID的算法,生成的ID称为Snowflake IDs或snowflakes。这种算法由Twitter创建,并用于推文的ID。目前仓储平台生成ID是用的雪花算法修改后的版本。雪花算法几个特性* 生成的ID分布式唯一和按照时间递增有序,毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。* 不依赖数据库等三方系统,稳定性更高,性能非常高的
01
Jayway JsonPath-提取JSON文档内容的Java DSL
介绍JsonPath是一种能够提取部分JSON文档属性、对象、数组的语法,支持条件过滤、数学运算、字符串处理等功能。JsonPath与JSON文档就像 XPath 表达式与 XML 文档结合使用一样。由于 JSON 结构通常是匿名的,并不一定和XML一样具有“根成员对象”,因此 JsonPath假定分配$给外层对象的抽象名称。JsonPath由用点分隔的表达式段(操作符)组成。 操作符可以是一个简
15230106379_p
文章数
2
阅读量
332
作者其他文章
01
拆解雪花算法生成规则
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号