Jayway JsonPath-提取JSON文档内容的Java DSL

这篇具有很好参考价值的文章主要介绍了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 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-747440.html

到了这里,关于Jayway JsonPath-提取JSON文档内容的Java DSL的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬虫(十六)_JSON模块与JsonPath

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是的人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。 JSON和XML的比较可谓不相上下。 Python2.7中自带了JSON模块,直接 import json 就可

    2024年02月10日
    浏览(31)
  • Java Word提取内容

    2024年02月13日
    浏览(29)
  • 递归解析Json,实现生成可视化Tree+快速获取JsonPath

    内部平台的一个小功能点的实现过程,分享给大家: 递归解析Json,可以实现生成可视化Tree+快速获取JsonPath 。 步骤: 1.利用JsonPath读取根,获取JsonObject 2.递归层次遍历JsonObjec,保存结点信息 3.利用zTree展示结点为可视化树,点击对应树的结点即可获取对应结点的JsonPath 示例

    2024年02月08日
    浏览(32)
  • Java poi之word文本图片内容提取

    应公司需求,需实现以下功能 word文本内容的替换; word文本内容的提取; word文档中图片的提取存放 此文章将使用Apache POI实现Word文档中文本内容及图片的提取; Apache POI 是基于 Office Open XML 标准(OOXML)和 Microsoft 的 OLE 2 复合文档格式(OLE2)处理各种文件格式的开源项目。

    2024年02月10日
    浏览(42)
  • Java poi之Excel文本图片内容提取

    应公司需求,需实现以下功能 Excel文本内容的替换; Excel文本内容的提取; Excel中图片的提取存放 此文章将使用Apache POI实现Excel文件中文本内容及图片的提取; Apache POI 是基于 Office Open XML 标准(OOXML)和 Microsoft 的 OLE 2 复合文档格式(OLE2)处理各种文件格式的开源项目。

    2024年02月05日
    浏览(69)
  • Java实战:高效提取PDF文件指定坐标的文本内容

    临时接到一个紧急需要处理的事项。业务侧一个同事有几千个PDF文件需要整理:需要从文件中的指定位置获取对应的编号和地址。 要的急,工作量大。所以就问到技术部有没有好的解决方案。 问技术的话就只能写个demo跑下了。 PDF的文档看起来比较简单,因为只是需要读取两

    2024年02月13日
    浏览(45)
  • Java如何快速读取&解析JSON数据(文件),获取想要的内容?

    手打不易,如果转摘,请注明出处! 注明原文: https://zhangxiaofan.blog.csdn.net/article/details/132764186 目录 前言 准备工作 Json数据(示例) 解析Json文件 第一步:创建一个空类 第二步:使用 Gsonformat 插件  第三步:复制Json内容,创建对应类 第四步:读取Json文件,提取目标数据

    2024年02月05日
    浏览(63)
  • PDF 文档处理:使用 Java 对比 PDF 找出内容差异

    不论是在团队写作还是在个人工作中,PDF 文档往往会经过多次修订和更新。掌握 PDF 文档内容的变化对于管理文档有极大的帮助。通过对比 PDF 文档,用户可以快速找出文档增加、删除和修改的内容,更好地了解文档的演变过程,轻松地管理文档。本文将介绍如何通过 Java 程

    2024年02月08日
    浏览(45)
  • Java POI导出富文本的内容到word文档

    当创建使用富文本编辑器,操作完的数据,传输到后台都是带有html标签的。 如:h1标题头/h1h2第二个标题/h2a href=\\\"www.baidu.com\\\"百度搜索/a 我们想把富文本数据转换为Word内容。 Word是完全支持html标签的,但是我们获取到的富文本内容并不是完整的html代码,所有我们需要先补全

    2024年02月09日
    浏览(38)
  • 【Python从入门到进阶】30、JSONPath的介绍和使用

    接上篇《29、xpath抓取站长素材图片》 上一篇我们讲解了如何利用xpath来抓取站长素材网站的图片区首页的所有图片,本篇我们来介绍JSONPath的基础和具体使用。 1、什么是JSONPath? JSONPath是一种用于在JSON(JavaScript Object Notation)数据中定位和提取特定元素的查询语言。它类似于

    2024年01月22日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包