Analizar datos JSON nesteds utilizando GSON

Estoy tratando de analizar algunos datos JSON usando gson en Java que tiene la siguiente estructura pero al mirar ejemplos en línea, no puedo encontrar nada que haga el trabajo.

¿Alguien podría ayudar?

{ "data":{ "id":[ { "stuff":{ }, "values":[ [ 123, 456 ], [ 123, 456 ], [ 123, 456 ], ], "otherStuff":"blah" } ] } } 

Solo necesita crear una estructura de clase Java que represente los datos en su JSON. Para hacer eso, te sugiero que copies tu JSON en este visor JSON en línea y verás la estructura de tu JSON mucho más clara …

Básicamente, necesitas estas clases (pseudo-código):

 class Response Data data class Data List id class ID Stuff stuff List> values String otherStuff 

¡Tenga en cuenta que los nombres de atributos en sus clases deben coincidir con los nombres de sus campos JSON! Puede agregar más atributos y clases según su estructura JSON real … ¡También tenga en cuenta que necesita getters y setters para todos sus atributos!

Finalmente, solo necesita analizar el JSON en su estructura de clase Java con:

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

¡Y eso es! Ahora puede acceder a todos sus datos dentro del objeto de response usando los getters y setters …

Por ejemplo, para acceder al primer valor 456 , deberá hacer:

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

Dependiendo de lo que estás tratando de hacer Podrías simplemente configurar una jerarquía de POJO que coincida con tu json como se ve aquí (Método preferido). O bien, podría proporcionar un deserializador personalizado. Solo traté con los datos de id porque asumí que era la implementación complicada en cuestión. Simplemente pise el json usando los tipos gson y construya los datos que intenta representar. Las clases Data e Id son solo pojos compuestos y que reflejan las propiedades en la cadena json original.

 public class MyDeserializer implements JsonDeserializer { @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 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); } 

}

Prueba:

  @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)); } 

Resultado:

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

POJO:

 public class Data { private List ids; public Data(List ids) { this.ids = ids; } @Override public String toString() { return "Data{" + "ids=" + ids + '}'; } } public class Id { private List nestedList; public Id() { nestedList = new ArrayList<>(); } public void addNestedValues(final Integer[] values) { nestedList.add(values); } @Override public String toString() { final List formattedOutput = new ArrayList(); for (Integer[] integers : nestedList) { formattedOutput.add(Arrays.asList(integers).toString()); } return "Id {" + "nestedList=" + formattedOutput + '}'; } }