Gson y deserializar una matriz de objetos con matrices en ella

Intento usar Gson para deserializar una cadena json devuelta desde mi servicio web

La estructura se devolverá como TypeDTO[] .

donde TypeDTO es como

 int id; String name; ArrayList items[] 

y ItemDTO es como

 int id; String name; Boolean valid; 

Cuando llamo al código de la siguiente manera

 Gson gson = new Gson(); TypeDTO[] mytypes = (TypeDTO[]) gson.fromJson(reply, TypeDTO[].class); 

Todo dentro de los objetos es nulo

Sin embargo, si uso el

JSONArray y JSONObject para sacarlos pieza por pieza de los archivos org.json, funciona bien y los campos se completan en consecuencia.

¿Alguna idea de lo que estoy haciendo mal? ¿Gson es extremadamente rápido? ¿O es mejor seguir con lo que ya tengo trabajando?

Gracias, David

El ejemplo de la estructura de datos de Java en la pregunta original no coincide con la descripción de la estructura JSON en el comentario.

El JSON se describe como

“una matriz de {objeto con una matriz de {objeto}}”.

En términos de los tipos descritos en la pregunta, el JSON se tradujo en una estructura de datos Java que coincidiría con la estructura JSON para una fácil deserialización con Gson.

“una matriz de {objeto TypeDTO con una matriz de {ItemDTO object}}”.

Pero la estructura de datos de Java proporcionada en la pregunta no es esta. En cambio es

“una matriz de {objeto TypeDTO con una matriz de una matriz de {ItemDTO object}}”.

Una matriz bidimensional! = Una matriz unidimensional.

Este primer ejemplo demuestra el uso de Gson para simplemente deserializar y serializar una estructura JSON que es “una matriz de {objeto con una matriz de {objeto}}”.

Contenido de input.json:

 [ { "id":1, "name":"name1", "items": [ {"id":2,"name":"name2","valid":true}, {"id":3,"name":"name3","valid":false}, {"id":4,"name":"name4","valid":true} ] }, { "id":5, "name":"name5", "items": [ {"id":6,"name":"name6","valid":true}, {"id":7,"name":"name7","valid":false} ] }, { "id":8, "name":"name8", "items": [ {"id":9,"name":"name9","valid":true}, {"id":10,"name":"name10","valid":false}, {"id":11,"name":"name11","valid":false}, {"id":12,"name":"name12","valid":true} ] } ] 

Foo.java:

 import java.io.FileReader; import java.util.ArrayList; import com.google.gson.Gson; public class Foo { public static void main(String[] args) throws Exception { Gson gson = new Gson(); TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class); System.out.println(gson.toJson(myTypes)); } } class TypeDTO { int id; String name; ArrayList items; } class ItemDTO { int id; String name; Boolean valid; } 

Este segundo ejemplo utiliza en su lugar una estructura JSON que en realidad es “una matriz de {objeto TypeDTO con una matriz de una matriz de {objeto ItemDTO}}” para que coincida con la estructura de datos Java proporcionada originalmente.

Contenido de input.json:

 [ { "id":1, "name":"name1", "items": [ [ {"id":2,"name":"name2","valid":true}, {"id":3,"name":"name3","valid":false} ], [ {"id":4,"name":"name4","valid":true} ] ] }, { "id":5, "name":"name5", "items": [ [ {"id":6,"name":"name6","valid":true} ], [ {"id":7,"name":"name7","valid":false} ] ] }, { "id":8, "name":"name8", "items": [ [ {"id":9,"name":"name9","valid":true}, {"id":10,"name":"name10","valid":false} ], [ {"id":11,"name":"name11","valid":false}, {"id":12,"name":"name12","valid":true} ] ] } ] 

Foo.java:

 import java.io.FileReader; import java.util.ArrayList; import com.google.gson.Gson; public class Foo { public static void main(String[] args) throws Exception { Gson gson = new Gson(); TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class); System.out.println(gson.toJson(myTypes)); } } class TypeDTO { int id; String name; ArrayList items[]; } class ItemDTO { int id; String name; Boolean valid; } 

En cuanto a las dos preguntas restantes:

¿Gson es extremadamente rápido?

No se compara con otras API de deserialización / serialización. Gson ha estado tradicionalmente entre los más lentos . Se informa que las versiones actual y siguiente de Gson incluyen mejoras significativas en el rendimiento, aunque no he buscado los últimos datos de pruebas de rendimiento para respaldar esas afirmaciones.

Dicho eso, si Gson es lo suficientemente rápido para sus necesidades, entonces debido a que hace que la deserialización de JSON sea tan fácil, probablemente tenga sentido usarla. Si se requiere un mejor rendimiento, entonces Jackson podría ser una mejor opción de usar. Ofrece muchas (tal vez incluso todas) las comodidades de Gson.

¿O es mejor seguir con lo que ya tengo trabajando?

Yo no lo haría Siempre preferiría tener una línea simple de código como

 TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class); 

… para deserializar fácilmente en una estructura de datos compleja, que las treinta líneas de código que de otro modo serían necesarias para mapear las piezas juntas un componente a la vez.

Usa tu clase de bean así, si tus datos JSON comienzan con un objeto de matriz. esto te ayuda.

 Users[] bean = gson.fromJson(response,Users[].class); 

Los usuarios son mi clase de frijoles.

La respuesta es mi información JSON.