objects - jsonobject to object java
¿Cómo uso la API Gson de Google para deserializar JSON correctamente? (2)
En resumen, este es un boceto del objeto JSON que quiero analizar en JAVA:
{
object1: {
item1: //[String | Array | Object] ,
item2: // ...
//<> more items
object2: { /* .. */ }
//<> more objects
}
Estos son los POJO que creé para analizar (omitiré las declaraciones de import
en aras de la brevedad):
(1) La representación del objeto JSON completo
public class JObjectContainer {
private List<JObject> jObjects ;
public JObjectContainer() { }
//get & set methods
}
(2) La representación de los objetos anidados:
public class JObject {
private String id ;
private List<JNode> jObjects ;
public JObject() { }
//get & set methods
}
(3) La representación de los artículos:
public class JNode {
private JsonElement item1 ;
private JsonElement item2 ;
//<> more item fields
public JNode() { }
//get & set methods
}
Ahora, creando una instancia de Gson ( FileReader
para importar jsonFile
),
Gson gson = new Gson() ;
JObjectContainer joc = gson.fromJson(jsonFile,JObjectContainer.class) ;
Obtengo una NullPointerException
cada vez que intento acceder al objeto analizable (por ejemplo, a través de ListIterator
). Sin embargo , Gson crea un objeto de la clase que especifiqué y no arroja ningún error posterior.
Sé que esto ya se ha hecho antes. Entonces, ¿qué me estoy perdiendo?
TIA
Creo que BalusC dio buenos consejos para la pregunta específica de GSon (y, en general, enlace de datos uno a uno); pero por si crees que debería haber un manejo más dinámico, también podrías considerar otros paquetes de procesamiento JSON. Muchos paquetes tienen formas adicionales o alternativas para mapear cosas: Json-lib, flexjson y Jackson al menos tienen adiciones en comparación con Gson. Algunos ofrecen mapeo más flexible (se definen los nombres de las cosas para los tipos), otros soporte real para los tipos polimórficos (declarando un Objeto, pero en realidad se puede mapear al subtipo que se serializó).
Eso no es posible. Necesita modificar su estructura JSON para representar object1
, object2
, etc. como elementos de una matriz . En este momento son propiedades de un objeto del cual aparentemente no se sabe cuántos de ellos serán (de lo contrario, no intentó mapearlo como una List
). Gson es inteligente, pero no tan inteligente :)
Entonces, como ejemplo básico, esta estructura JSON con una matriz:
{ nodes:
[
{ item1: ''value1a'', item2: ''value2a'' },
{ item1: ''value1b'', item2: ''value2b'' },
{ item1: ''value1c'', item2: ''value2c'' }
]
}
en combinación con la representación de Java (que no necesariamente se llamará POJO, sino simplemente javabean o objeto de modelo u objeto de valor).
public class Container {
private List<Node> nodes;
// +getter.
}
public class Node {
private String item1;
private String item2;
// +getters.
}
y esta llamada de Gson
Container container = new Gson().fromJson(json, Container.class);
Deberia trabajar.
Actualización : para que quede claro, su estructura JSON es el problema, no su estructura de objeto Java. Suponiendo que su estructura de objeto Java es exactamente lo que le gustaría terminar, entonces su estructura JSON debe verse de la siguiente manera para que Gson haga su trabajo:
{ jObjects:
[
{ id: 123, jObjects:
[
{ item1: ''value1a'', item2: ''value2a'' },
{ item1: ''value1b'', item2: ''value2b'' },
{ item1: ''value1c'', item2: ''value2c'' }
/* etc... commaseparated */
]
},
{ id: 456, jObjects:
[
{ item1: ''value1d'', item2: ''value2d'' },
{ item1: ''value1e'', item2: ''value2e'' },
{ item1: ''value1f'', item2: ''value2f'' }
/* etc... commaseparated */
]
}
/* etc... commaseparated */
]
}
Solo la propiedad JsonElement
debe reemplazarse por String
, ya que no es válida.