Java使用JSONPath解析JSON完整內容詳解


簡介

  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}]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM