2016-05-18 3 views
0

Как я могу десериализовать этот комплекс JSON. Я хочу получить доступ ко всем объектам и прочитать. Например, поля SelectionId и AdditionalPriceInfo путем индексирования. прибудете (0) .getSelectionId() -> d51d38c9-6e51-473c-b843-f24fef632f89Комплекс десериализации JSON с gson Java

{ 
    "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" 
    } 
} 

Мой код до сих пор для доступа ко всем я хочу:

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()); 

Когда я разделил мой JSON , Я могу получить доступ к значениям, которые я хочу.

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

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

} 

Успешный код и доступ к значениям.

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()); 

Когда я использую один и тот же код для первого незанятого JSON, не работает и с java.lang.NullPointerException как ошибка

+1

Хорошим началом было бы создание POJO, отражающих эту структуру. Комплекс здесь довольно субъективен. – rmlan

+0

Я построил POJO. Все классы готовы. Я запутался в вызове массивов в объектах. В результате у меня есть нуль. – bkm

+0

Что ж, вы не думаете, что этот код может помочь нам в оказании помощи? – rmlan

ответ

0

вам нужно построить один объект с несколькими дочерними объектами, которое представляет JSON-структура. работает следующий код! (testet с java 8 и gson 2.6.2)

@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; 
} 
+0

Все эти классы уже в моем проекте – bkm

+0

Если да, то какова ваша настоящая «проблема»? –

+0

Я получаю результат из этой строки System.out.println (data.getResult(). GetItineraries()); Однако я не могу идти дальше. Напр. Я не могу добраться до totalTravelTime. @ Кристоф-Тобиас Шенке – bkm

Смежные вопросы