2013-10-03 24 views

Odpowiedz

39

Trzeba tylko utworzyć strukturę klasy Java, która reprezentuje dane w twoim JSON. W tym celu, proponujemy, aby skopiować JSON do tego online JSON Viewer a zobaczysz strukturę swojej JSON znacznie wyraźniejsze ...

Zasadniczo trzeba tych klas (pseudo-kod):

class Response 
    Data data 

class Data 
    List<ID> id 

class ID 
    Stuff stuff 
    List<List<Integer>> values 
    String otherStuff 

Należy pamiętać, że nazwy atrybutów w klasach muszą być zgodne z nazwami pól JSON! Możesz dodać więcej atrybutów i klas zgodnie z twoją rzeczywistą strukturą JSON ... Zwróć też uwagę, że potrzebujesz modułów pobierających i ustawiających dla wszystkich atrybutów!

Wreszcie, po prostu trzeba analizować JSON w swojej strukturze klasowej Java z:

Gson gson = new Gson(); 
Response response = gson.fromJson(yourJsonString, Response.class); 

I to jest to! Teraz można uzyskać dostęp do wszystkich danych w obiekcie response używając pobierające i ustawiające ...

na przykład w celu uzyskania dostępu do pierwszej wartości 456, trzeba zrobić:

int value = response.getData().getId().get(0).getValues().get(0).get(1); 
+0

biorę wolność sugerowania ci http://json.parser.online.fr/, zauważyła również błąd składniowy w Json dostarczony przez PO. – giampaolo

+0

Myślę, że [link] [http://www.jsonschema2pojo.org] jest naprawdę przydatny przy podejmowaniu odpowiedzi JSON i tworzeniu obiektów Java dla ciebie! –

8

W zależności od tego, co próbujesz zrobić. Możesz ustawić hierarchię POJO, która pasuje do twojej json, jak widać here (preferowana metoda). Lub możesz podać niestandardowy deserializer. Zajmowałem się tylko danymi id, ponieważ zakładałem, że była to trudna implementacja. Po prostu przejdź przez json używając typów i stwórz dane, które próbujesz reprezentować. Klasy Data i Id są tylko pojos złożone z i odzwierciedlają właściwości w oryginalnym łańcuchu json.

public class MyDeserializer implements JsonDeserializer<Data> 
{ 

    @Override 
    public Data deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException 
    { 
    final Gson gson = new Gson(); 
    final JsonObject obj = je.getAsJsonObject(); //our original full json string 
    final JsonElement dataElement = obj.get("data"); 
    final JsonElement idElement = dataElement.getAsJsonObject().get("id"); 
    final JsonArray idArray = idElement.getAsJsonArray(); 

    final List<Id> parsedData = new ArrayList<>(); 
    for (Object object : idArray) 
    { 
     final JsonObject jsonObject = (JsonObject) object; 
     //can pass this into constructor of Id or through a setter 
     final JsonObject stuff = jsonObject.get("stuff").getAsJsonObject(); 
     final JsonArray valuesArray = jsonObject.getAsJsonArray("values"); 
     final Id id = new Id(); 
     for (Object value : valuesArray) 
     { 
     final JsonArray nestedArray = (JsonArray)value; 
     final Integer[] nest = gson.fromJson(nestedArray, Integer[].class); 
     id.addNestedValues(nest); 
     } 
     parsedData.add(id); 
    } 
    return new Data(parsedData); 
    } 

}

testu:

@Test 
    public void testMethod1() 
    { 
    final String values = "[[123, 456], [987, 654]]"; 
    final String id = "[ {stuff: { }, values: " + values + ", otherstuff: 'stuff2' }]"; 
    final String jsonString = "{data: {id:" + id + "}}"; 
    System.out.println(jsonString); 
    final Gson gson = new GsonBuilder().registerTypeAdapter(Data.class, new MyDeserializer()).create(); 
    System.out.println(gson.fromJson(jsonString, Data.class)); 
    } 

Wynik:

Data{ids=[Id {nestedList=[[123, 456], [987, 654]]}]} 

POJO:

public class Data 
{ 

    private List<Id> ids; 

    public Data(List<Id> ids) 
    { 
    this.ids = ids; 
    } 

    @Override 
    public String toString() 
    { 
    return "Data{" + "ids=" + ids + '}'; 
    } 
} 


public class Id 
{ 

    private List<Integer[]> nestedList; 

    public Id() 
    { 
    nestedList = new ArrayList<>(); 
    } 

    public void addNestedValues(final Integer[] values) 
    { 
    nestedList.add(values); 
    } 

    @Override 
    public String toString() 
    { 
    final List<String> formattedOutput = new ArrayList(); 
    for (Integer[] integers : nestedList) 
    { 
    formattedOutput.add(Arrays.asList(integers).toString()); 
    } 
    return "Id {" + "nestedList=" + formattedOutput + '}'; 
    } 
} 
Powiązane problemy