[英]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.