Linux開放防火牆指定埠
阿新 • • 發佈:2021-06-28
簡介
JsonPath是一種簡單的方法來提取JSON文件的方法。它支援的程式語言有很多,如java、python、JavaScript和PHP。
JsonPath提供的json解析非常強大,它提供了類似正則表示式的語法,基本上可以滿足所有你想要獲得的json內容。
maven依賴
<!-- https://mvnrepository.com/artifact/com.jayway.jsonpath/json-path --> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>2.6.0</version> </dependency>
操作符
操作符 | 說明 |
$ | 表示根元素 |
@ | 當前元素 |
. or [] | 子元素 |
n/a | 父元素 |
* | 萬用字元,表示所有的元素 |
.. | 選擇所有符合條件的節點 |
[] | 迭代器標識,如陣列下標 |
[,] | 連線操作符在XPath 結果合併其它結點集合。JSONP允許name或者陣列索引。 |
[start,step] | 陣列切片操作 |
?() | 過濾表示式 |
() | 支援表示式計算 |
函式
函式可以在路徑的尾部呼叫,函式的輸出是路徑表示式的輸出,該函式的輸出是由函式本身所決定的
函式 | 描述 | 輸出 |
min() | 提供陣列的最小值 | Double |
max() | 提供陣列的最大值 | Double |
avg() | 提供陣列的平均值 | Double |
stddev() | 提供陣列的標準偏差值 | Double |
length() | 提供陣列的長度 | Integer |
sum() | 提供陣列的總和 | Double |
keys() | 提供屬性鍵(終端波浪號的替代方案 ~) | Set<E> |
concat(X) | 提供帶有新專案的路徑輸出的串聯版本 | like input |
append(X) | 向 json 路徑輸出陣列新增一個專案 | like input |
過濾操作符
過濾器是用於過濾陣列的邏輯表示式。 典型的過濾器是 [?(@.age > 18)] ,其中 @ 代表正在處理的當前專案。 可以使用邏輯運算子 && 和 || 來建立更復雜的過濾器。 字串文字必須用單引號或雙引號括起來([?(@.color == 'blue')] 或 [?(@.color == "blue")])。
操作符 | 說明 |
== | left等於right(注意1不等於'1') |
!= | 不等於 |
< | 小於 |
<= | 小於等於 |
> | 大於 |
>= | 大於等於 |
=~ | 匹配正則表示式[?(@.name =~ /foo.*?/i)] |
in | 左邊存在於右邊 [?(@.size in [‘S', ‘M'])] |
nin | 左邊不存在於右邊 |
subsetof | 左邊是 右邊 [?(@.sizes subnetof ['S', 'M', 'L'])] 的子集 |
anyof | 左邊與右邊有交集 [?(@.sizes anyof ['M', 'L'])] |
noneof | 左邊與右邊沒有交集 [?(@.sizes noneof ['M', 'L'])] |
size | (陣列或字串)長度 |
empty | (陣列或字串)為空 |
測試的json資料
{ "text": "張三", "expensive": 6, "body": { "rvNoNum": 23, "rvNoRecords": [{ "score": 4, "rvAddress": "2", "consignments": null }, { "score": 8, "rvAddress": "3", "consignments": null }] } }
測試程式碼
package jsonpathdemo; import com.fasterxml.jackson.databind.ObjectMapper; import com.jayway.jsonpath.JsonPath; import java.io.IOException; import java.util.HashMap; import java.util.List; public class jsonpathTest { public static void main(String[] args) throws IOException { // 定義需要測試的json字串 String testJson = "{\n" + " \"text\": \"張三\",\n" + " \"expensive\": 6,\n" + " \"body\": {\n" + " \"rvNoNum\": 23,\n" + " \"rvNoRecords\": [{\n" + " \"score\": 4,\n" + " \"rvAddress\": \"2\",\n" + " \"consignments\": null\n" + " }, {\n" + " \"score\": 8,\n" + " \"rvAddress\": \"3\",\n" + " \"consignments\": null\n" + " }]\n" + " }\n" + "}"; //使用jackson對字串反序列化為json物件 ObjectMapper mapper = new ObjectMapper ( ); HashMap responseJson = mapper.readValue ( testJson, HashMap.class ); // 輸出text的值 String text = JsonPath.read(responseJson,"$.text"); System.out.println (text ); // 輸出rvNoNum的值 int rvNoNum = JsonPath.read(responseJson,"$.body.rvNoNum"); System.out.println ( rvNoNum); //輸出rvNoRecords陣列的第2個值 List<Object> rvNoRecords = JsonPath.read(responseJson,"$..rvNoRecords[1]"); System.out.println ( rvNoRecords); //輸出rvNoRecords陣列的第1和第2個值 List<Object> rvNoRecords1 = JsonPath.read(responseJson,"$..rvNoRecords[0,1]"); System.out.println (rvNoRecords1 ); //輸出rvNoRecords陣列中score<=expensive的所有值 List<Object> rvNoRecords2 = JsonPath.read(responseJson,"$..rvNoRecords[?(@.score < $['expensive'])]"); System.out.println ( rvNoRecords2); //輸出rvNoRecords[0]的rvAddress值 String rvAddress1 = JsonPath.read(responseJson, "$.body.rvNoRecords[0].rvAddress"); System.out.println ( rvAddress1); //輸出全部rvAddress的值,使用Iterator迭代 List<String> rvAddress = JsonPath.read(responseJson,"$.body.rvNoRecords[*].rvAddress"); System.out.println ( rvAddress); //輸出rvNoRecords[*]中rvAddress== '2'的rvNoRecords List<Object> rvAddress2 = JsonPath.read(responseJson,"$.body.rvNoRecords[?(@.rvAddress == 2)]"); System.out.println (rvAddress2 ); //輸出rvNoRecords[*]中score>5 的rvNoRecords List<Object> score = JsonPath.read(responseJson,"$.body.rvNoRecords[?(@.score>5)]"); System.out.println ( score); //輸出rvNoRecords[*]中含有consignments元素的rvNoRecords List<Double> consignments = JsonPath.read(responseJson,"$.body.rvNoRecords[?(@.consignments)]"); System.out.println ( consignments); //輸出該json中所有rvAddress的值 List<Object> rvNoNum2 = JsonPath.read(responseJson,"$..rvAddress"); System.out.println (rvNoNum2 ); //輸出rvNoRecords陣列的長度 Integer length = JsonPath.read(responseJson,"$..rvNoRecords.length()"); System.out.println (length ); //可以提前編輯一個路徑,並多次使用它 JsonPath path = JsonPath.compile("$.body.rvNoRecords[*]"); List<Object> rvNoRecords3 = path.read(responseJson); System.out.println (rvNoRecords3 ); } }
測試結果:
張三
23
[{"score":8,"rvAddress":"3","consignments":null}]
[{"score":4,"rvAddress":"2","consignments":null},{"score":8,"rvAddress":"3","consignments":null}]
[{"score":4,"rvAddress":"2","consignments":null}]
2
["2","3"]
[{"score":4,"rvAddress":"2","consignments":null}]
[{"score":8,"rvAddress":"3","consignments":null}]
[{"score":4,"rvAddress":"2","consignments":null},{"score":8,"rvAddress":"3","consignments":null}]
["2","3"]
2
[{"score":4,"rvAddress":"2","consignments":null},{"score":8,"rvAddress":"3","consignments":null}]