【问题标题】:How to Parse only part of JSON?如何仅解析 JSON 的一部分?
【发布时间】:2020-09-02 06:33:51
【问题描述】:

我得到一个 json:

{
"trackResponse": {
    "shipment": [
        {
            "package": [
                {
                    "trackingNumber": "Y0081040217",
                    "deliveryDate": [
                        {
                            "type": "DEL",
                            "date": "20200817"
                        }
                    ],
                    "deliveryTime": {
                        "startTime": "",
                        "endTime": "145339",
                        "type": "DEL"
                    },
                    "activity": [
                        {
                            "location": {
                                "address": {
                                    "city": "TORONTO",
                                    "stateProvince": "",
                                    "postalCode": "",
                                    "country": "CA"
                                }
                            },
                            "status": {
                                "type": "D",
                                "description": "Delivered",
                                "code": "FS"
                            },
                            "date": "20200817",
                            "time": "145339"
                        },

我只想从这个 JSON 中保存一些东西。例如 [trackingNumber, city, country, type and description] 但我不明白我应该从 java 类中创建哪个结构来映射它们。

【问题讨论】:

  • 您可以在旧帖中使用此功能搜索Keyenter link description here
  • 您也可以尝试面向流的解析而不是对象映射baeldung.com/jackson-streaming-api,并在遍历 JSON 时记住您需要的所有字段。道具:1.不需要额外的依赖; 2.文件不需要完全加载到内存中,你可以毫无问题地处理megs/gigs; 3. 它的工作速度明显更快(当然,如果这很重要的话)
  • @AnatolyG 谢谢你的建议,我现在正在尝试这样做:)

标签: java json spring parsing jackson


【解决方案1】:

由于您需要 JSON 中的少量字段,我建议您使用 JSONPath API,以下是相同的 maven 依赖项。

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.4.0</version>
</dependency>

下面是获取所需字段的代码

public static void main(String[] args) throws IOException  {
    String json = "{\r\n" + 
            "   \"trackResponse\":{\r\n" + 
            "      \"shipment\":[\r\n" + 
            "         {\r\n" + 
            "            \"package\":[\r\n" + 
            "               {\r\n" + 
            "                  \"trackingNumber\":\"Y0081040217\",\r\n" + 
            "                  \"deliveryDate\":[\r\n" + 
            "                     {\r\n" + 
            "                        \"type\":\"DEL\",\r\n" + 
            "                        \"date\":\"20200817\"\r\n" + 
            "                     }\r\n" + 
            "                  ],\r\n" + 
            "                  \"deliveryTime\":{\r\n" + 
            "                     \"startTime\":\"\",\r\n" + 
            "                     \"endTime\":\"145339\",\r\n" + 
            "                     \"type\":\"DEL\"\r\n" + 
            "                  },\r\n" + 
            "                  \"activity\":[\r\n" + 
            "                     {\r\n" + 
            "                        \"location\":{\r\n" + 
            "                           \"address\":{\r\n" + 
            "                              \"city\":\"TORONTO\",\r\n" + 
            "                              \"stateProvince\":\"\",\r\n" + 
            "                              \"postalCode\":\"\",\r\n" + 
            "                              \"country\":\"CA\"\r\n" + 
            "                           }\r\n" + 
            "                        },\r\n" + 
            "                        \"status\":{\r\n" + 
            "                           \"type\":\"D\",\r\n" + 
            "                           \"description\":\"Delivered\",\r\n" + 
            "                           \"code\":\"FS\"\r\n" + 
            "                        },\r\n" + 
            "                        \"date\":\"20200817\",\r\n" + 
            "                        \"time\":\"145339\"\r\n" + 
            "                     }\r\n" + 
            "                  ]\r\n" + 
            "               }\r\n" + 
            "            ]\r\n" + 
            "         }\r\n" + 
            "      ]\r\n" + 
            "   }\r\n" + 
            "}";
    
    String[] jsonPaths = new String[5];
    jsonPaths[0] = "$.trackResponse.shipment[*].package[*].trackingNumber";
    jsonPaths[1] = "$.trackResponse.shipment[*].package[*].activity[*].location.address.city";
    jsonPaths[2] = "$.trackResponse.shipment[*].package[*].activity[*].location.address.country";
    jsonPaths[3] = "$.trackResponse.shipment[*].package[*].activity[*].status.description";
    jsonPaths[4]= "$.trackResponse.shipment[*].package[*].activity[*].status.type";
    
    DocumentContext jsonContext = JsonPath.parse(json);
    for (String path : jsonPaths) {
        List<String> result = jsonContext.read(path);
        System.out.println(result.get(0)); //assuming there is only one array else u can iterate
    }       
}

结果

Y0081040217
TORONTO
CA
Delivered
D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    相关资源
    最近更新 更多