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
$…id0,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 转载请注明来源

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ ifstream 下的中文乱码问题

先看示例代码&#xff1a; #include <cstdio> #include <iostream> #include <fstream> using namespace std;int main() {ifstream ip_file("读取.txt"); // “读取.txt”与代码文件位于同一目录string s;if (ip_file.is_open()) {// 读取txt内容…

Siemens S7-300主站Profibus网络设定以及OMRON设定

1.100L流量秤&#xff0c;历史值&#xff0c;D3426&#xff0c;D3427,7位 2.次数&#xff0c;D166&#xff0c;D177&#xff0c;5位 3.PROFIBUS地址03# 1.FA1&#xff0c;历史值&#xff0c;D3426&#xff0c;D3427,6位 2.包数区&#xff0c;D166&#xff0c;D177,5位 3.PROFIB…

nnunetv2 .pth 转 .onnx

nnunet v2版本的模型转化为onnx 转化为onnx后可以转化为engine文件&#xff0c;方便在c使用&#xff1b;&#xff08;可以移步tensorRT分类中看&#xff09; import torch from nnunetv2.inference.predict_from_raw_data import load_what_we_need from nnunetv2.utilities.…

前端:实现二级菜单(点击实现二级菜单展开)

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

【趣味篇】Scratch之windows11系统

【作品展示】windows11系统 操作&#xff1a;点击小绿旗进入windows11主页面&#xff0c;不仅是能打开浏览器&#xff0c;还可以进行背景切换等功能。

大数据——一文详解数据仓库概念(数据仓库的分层概念和维度建模详解)

1、ods是什么&#xff1f; ods层最好理解&#xff0c;基本上就是数据从源表拉过来&#xff0c;进行etl&#xff0c;比如MySQL映射到Hive&#xff0c;那么到了Hive里面就是ods层。ods全称是 Operational Data Store&#xff0c;操作数据存储——“面向主题的”&#xff0c;数据…

突破界限:R200科研无人车,开辟研究新天地

提到科研无人车&#xff0c;大家可能首先想到的是其在自动驾驶和其他先进技术领域的应用。然而&#xff0c;随着科技的不断进步&#xff0c;科研无人车已经在智慧城市建设、商业服务、地质勘探、环境保护、农业技术革新、灾害应急和自动化服务等多个领域发挥着至关重要的作用。…

Linux MTR(My TraceRoute)command

Internet上有许多小型网络测试工具:Ping、Traceroute、Dig、Host等。 但是&#xff0c;这些工具的功能都比较单一。今天会给大家分享一个包含ping和traceroute功能的工具&#xff1a;MTR 文章目录 什么是MTR&#xff1f;MTR可以提供哪些功能Linux MTR可用选项Linux MTR用法推荐…

【UGUI】事件侦听EventSystem系统0学

前言介绍 EventSystem是Unity UGUI中的一个重要组件&#xff0c;用于处理用户输入事件&#xff0c;如点击、拖拽、滚动等。它负责将用户输入事件传递给合适的UI元素&#xff0c;并触发相应的事件回调函数&#xff08;就是你想要做的事情&#xff0c;自定义函数&#xff09;。 …

ASCII

ASCII (American Standard Code for Information Interchange)&#xff1a;美国信息交换标准代码是基于拉丁字母的一套电脑编码系统&#xff0c;主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准&#xff0c;并等同于国际标准 ISO/IEC 646。ASCII第一次以规范标准…

FPGA程序执行相关知识点

1.目前&#xff0c;大多数FPGA芯片是基于 SRAM 的结构的&#xff0c; 而 SRAM 单元中的数据掉电就会丢失&#xff0c;因此系统上电后&#xff0c;必须要由配置电路将正确的配置数据加载到 SRAM 中&#xff0c;此后 FPGA 才能够正常的运行。 常见的配置芯片有EPCS 芯片 &#x…

最新报告!11月美国市场的“遥遥领先”来了,该爆的单总会来!

今年周期最长的大促节点已接近尾声&#xff0c;美区市场的11月份的商品销售战绩已全面来袭&#xff1a; 保健类目竟弯道超车&#xff0c;交出了将近翻倍的成绩单&#xff1b;美妆个护、女装与女士内衣等“她经济”类目持续高涨且“辣眼”单品不断&#xff1b;家居大类目下的市…

JenKins快速安装与使用,Gitlab自动触发Jenkins

一、JenKins 0.准备&#xff0c;配置好环境 1&#xff09;Git&#xff08;yum安装&#xff09; 2&#xff09;JDK&#xff08;自行下载&#xff09; 3&#xff09;Jenkins&#xff08;自行下载&#xff09; 1.下载安装包 进官网&#xff0c;点Download下方即可下载。要下…

服务器怎么提高容错率呢

一、服务器的开关电源供货 确保服务器有着数据冗余的开关电源供货&#xff0c;包含公司级ups电源、按时检验的预留发电机组等。假如大数据中心沒有数据冗余 电力工程&#xff0c;将会造成服务器终断运行。 二、服务器硬件数据冗余 不管租赁哪些服务器&#xff0c;服务器硬件和互…

《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-01-计算机硬件

文章目录 1. 计算机系统概述2. 计算机硬件2.1 处理器(CPU)2.2 存储器2.2.1 概述2.2.2 按硬件结构分类2.2.3 按与处理器距离分2.3 总线(Bus)2.3.1 概念2.3.2 分类2.3.3 串行总线和并行总线2.4 接口2.4.1 概念2.4.2 常见接口2.5 外部设备1. 计算机系统概述 #mermaid-svg-lacsya…

使用netconf配置华为设备

实验目的&#xff1a; 公司有一台CE12800的设备&#xff0c;管理地址位172.16.1.2&#xff0c;现在需要编写自动化脚本&#xff0c;通过SSH登陆到设备上配置netconf协议的用户名&#xff0c;密码以及netconf服务&#xff0c;并且通过netconf协议将设备的loopback0接口IP地址配…

一文读懂Asyncio

什么是Asyncio asyncio 是用来编写并发代码的库&#xff0c;使用async/await语法。 asyncio 被用作多个提供高性能 Python 异步框架的基础&#xff0c;包括网络和网站服务&#xff0c;数据库连接库&#xff0c;分布式任务队列等等。 asyncio 往往是构建 IO 密集型和高层级结构化…

genimage 打包镜像

前言 buildroot 使用 genimage 工具打包镜像 工作原理 用户准备好待打包的原料&#xff1a;uboot.bin、zImage、rootfs 等&#xff0c;然后编写一个配置文件 genimage.cfg&#xff0c;描述如何进行打包&#xff0c;然后执行命令 genimage -c genimage.cfg 就可以打包好一个镜…

Linux创建与编辑视图

本博客将会详细讲解如何在Linux中如何编辑配置文件 输出重定向 对于一台设备而言&#xff0c;存在着两种设备&#xff0c;分别负责输入与输出&#xff1a; 显示器&#xff08;输出设备>&#xff09; 与 键盘&#xff08;输入设备<&#xff09; 对于Linux系统而言&#…

java 猜年龄

猜年龄 问题描述 美国数学家维纳(N.Wiener)智力早熟&#xff0c;11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次&#xff0c;他参加某个重要会议&#xff0c;年轻的脸孔引人注目。于是有人询问他的年龄&#xff0c;他回答说&#xff1a; “我年龄的立方是个4…