简体   繁体   English

使用gson Java进行复杂的JSON反序列化

[英]Complex JSON deserialization with gson Java

How can I deserialize this complex JSON . 我如何反序列化此复杂的JSON。 I want to access all objects and read. 我想访问所有对象并阅读。 For example SelectionId and AdditionalPriceInfo fields by indexing. 例如,通过索引建立SelectionId和AdditionalPriceInfo字段。 get(0).getSelectionId() --> d51d38c9-6e51-473c-b843-f24fef632f89 get(0).getSelectionId()-> d51d38c9-6e51-473c-b843-f24fef632f89

{
    "Status": 0,
    "Message": "",
    "Result": {
        "HasMore": "False",
        "Itineraries": [
            {
                "SelectionId": "d51d38c9-6e51-473c-b843-f24fef632f89",
                "AdditionalPriceInfo": null,
                "Trips": [
                    {
                        "TotalTravelTime": "02:00:00"
                    }
                ]
            },
            {
                "SelectionId": "ff44d76a-a4c8-4aff-9f9d-6db4e1f3092c",
                "AdditionalPriceInfo": null,
                "Trips": [
                    {
                        "TotalTravelTime": "01:23:00"
                    }
                ]
            }
        ],
        "SearchOriginCityText": "Long Beach",
        "SearchOriginAirportCode": "LGB",
        "SearchDestinationCityText": "SFO",
        "SearchDestinationAirportCode": "SFO"
    }
}

My code so far for accessing all I want: 到目前为止,我的代码可以访问我想要的所有内容:

Gson gson2 = new Gson();

AirJson airJson = gson2.fromJson(airFullResult3, AirJson.class);
Itineraries itineraries = gson2.fromJson(airFullResult3, Itineraries.class);
Result result = gson2.fromJson(airFullResult3, Result.class);

//Having null instead SFO
System.out.println(result.getSearchDestinationAirportCode());

//Having null
System.out.println(itineraries.getAdditionalPriceInfo());

When I split my JSON, I can access the values that I want. 拆分JSON时,可以访问所需的值。

{
    "Itineraries": [{
        "SelectionId": "d51d38c9-6e51-473c-b843-f24fef632f89",
        "AdditionalPriceInfo": null

    }, {
        "SelectionId": "dda40b80-d8e4-4b76-9f78-83297b52afe9",
        "AdditionalPriceInfo": null
    }]

}

Successful code and I access values. 成功的代码,我访问值。

 JsonParser parser = new JsonParser();
 JsonObject rootObject = parser.parse(airFullResult).getAsJsonObject();
 JsonElement projectElement = rootObject.get("Itineraries");

 Type listofObject = new TypeToken<List<Itineraries>>(){}.getType();
 List<Itineraries> itiList = gson2.fromJson(projectElement, listofObject);

 //Having d51d38c9-6e51-473c-b843-f24fef632f89 as a result
 //which is great
 System.out.println(itiList.get(0).getSelectionId());

When I use the same code for first unallocated JSON, doesn't work and having java.lang.NullPointerException as error 当我对第一个未分配的JSON使用相同的代码时,无法正常工作,并且将java.lang.NullPointerException作为错误

you need to build one object with a couple of child objects which represents your json-structure. 您需要用几个代表json结构的子对象来构建一个对象。 the following code works! 以下代码有效! (testet with java 8, and gson 2.6.2) (带有Java 8和gson 2.6.2的testet)

@Test
public void test() {
    Gson gson = new Gson();
    Data data = gson.fromJson(getJson(), Data.class);

    Assert.assertNotNull(data);
    Assert.assertNotNull(data.result);
    Assert.assertNotNull(data.result.itineraries);
    Assert.assertEquals(2, data.result.itineraries.length);
    Assert.assertEquals("d51d38c9-6e51-473c-b843-f24fef632f89", data.result.itineraries[0].selectionId);
    Assert.assertEquals("ff44d76a-a4c8-4aff-9f9d-6db4e1f3092c", data.result.itineraries[1].selectionId);
}

public class Data {
    @SerializedName("Status")
    int status;
    @SerializedName("Message")
    String message;
    @SerializedName("Result")
    Result result;
}

public class Result {
    @SerializedName("HasMore")
    String hasMore;
    @SerializedName("Itineraries")
    Itineraries[] itineraries;
    @SerializedName("SearchOriginCityText")
    String searchOriginCityText;
    @SerializedName("SearchOriginAirportCode")
    String searchOriginAirportCode;
    @SerializedName("SearchDestinationCityText")
    String searchDestinationCityText;
    @SerializedName("SearchDestinationAirportCode")
    String searchDestinationAirportCode;
}

public class Itineraries {
    @SerializedName("SelectionId")
    String selectionId;
    @SerializedName("AdditionalPriceInfo")
    String additionalPriceInfo;
    @SerializedName("Trips")
    Trips[] trips;
}

public class Trips {
    @SerializedName("TotalTravelTime")
    String totalTravelTime;
}

private String getJson() {
    String json = "";
    json += "{";
    json += "    \"Status\": 0,";
    json += "    \"Message\": \"\",";
    json += "    \"Result\": {";
    json += "        \"HasMore\": \"False\",";
    json += "        \"Itineraries\": [";
    json += "            {";
    json += "                \"SelectionId\": \"d51d38c9-6e51-473c-b843-f24fef632f89\",";
    json += "                \"AdditionalPriceInfo\": null,";
    json += "                \"Trips\": [";
    json += "                    {";
    json += "                        \"TotalTravelTime\": \"02:00:00\"";
    json += "                    }";
    json += "                ]";
    json += "            },";
    json += "            {";
    json += "                \"SelectionId\": \"ff44d76a-a4c8-4aff-9f9d-6db4e1f3092c\",";
    json += "                \"AdditionalPriceInfo\": null,";
    json += "                \"Trips\": [";
    json += "                    {";
    json += "                        \"TotalTravelTime\": \"01:23:00\"";
    json += "                    }";
    json += "                ]";
    json += "            }";
    json += "        ],";
    json += "        \"SearchOriginCityText\": \"Long Beach\",";
    json += "        \"SearchOriginAirportCode\": \"LGB\",";
    json += "        \"SearchDestinationCityText\": \"SFO\",";
    json += "        \"SearchDestinationAirportCode\": \"SFO\"";
    json += "    }";
    json += "}";

    return json;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM