JsonPath是一種能夠提取部分JSON文檔屬性、對象、數組的語法,支持條件過濾、數學運算、字元串處理等功能。JsonPath與JSON文檔就像 XPath 表達式與 XML 文檔結合使用一樣。 ...
介紹
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 轉載請註明來源