Tengo una clase de Java MyPojo
que estoy interesado en deserializar de JSON. He configurado una clase MixIn especial MyPojoDeMixIn
, para ayudarme con la deserialización. MyPojo
tiene sólo int
y String
de instancia de variables combinadas con captadores y definidores adecuados. MyPojoDeMixIn
se parece a esto:
public abstract class MyPojoDeMixIn {
MyPojoDeMixIn(
@JsonProperty("JsonName1") int prop1,
@JsonProperty("JsonName2") int prop2,
@JsonProperty("JsonName3") String prop3) {}
}
En mi cliente de prueba hago lo siguiente, pero, por supuesto, no funciona en tiempo de compilación porque hay JsonMappingException
una falta de coincidencia de tipos relacionada.
ObjectMapper m = new ObjectMapper();
m.getDeserializationConfig().addMixInAnnotations(MyPojo.class,MyPojoDeMixIn.class);
try { ArrayList<MyPojo> arrayOfPojo = m.readValue(response, MyPojo.class); }
catch (Exception e) { System.out.println(e) }
Soy consciente de que podría solucionar este problema creando un objeto "Respuesta" que solo tenga un elemento ArrayList<MyPojo>
, pero luego tendría que crear estos objetos algo inútiles para cada tipo que quiero devolver.
También miré en línea JacksonInFiveMinutes, pero me costó mucho entender el tema Map<A,B>
y cómo se relaciona con mi problema. Si no puede decirlo, soy completamente nuevo en Java y tengo experiencia en Obj-C. Mencionan específicamente:
Además de la vinculación a POJO y tipos "simples", hay una variante adicional: la de vinculación a contenedores genéricos (con tipo). Este caso requiere un manejo especial debido al llamado Type Erasure (usado por Java para implementar genéricos de una manera algo compatible con versiones anteriores), que le impide usar algo como Collection.class (que no se compila).
Entonces, si desea vincular datos en un mapa, deberá usar:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
¿Cómo puedo deserializar directamente a ArrayList
?
Respuestas:
Puede deserializar directamente a una lista mediante el
TypeReference
contenedor. Un método de ejemplo:Y se usa así:
TypeReference Javadoc
fuente
TypeReference
- simplemente no sé cómo hacerlo ... Consulte mi edición anterior para obtener instrucciones sobre cómo usar genéricos.arrayList.toString()
about aNullPointerException
. Supongo que esto podría deberse a que myPOJO
no se ajusta a las convenciones de nomenclatura correctas para sus propiedades, es decir, todo el problema es que el servicio web regresaProp1Member
y mi objeto síProp1
. Esta es la única razón real por la que estoy usando mixins para empezar, por lo que no tengo que poner las declaraciones@JsonProperty
en mis objetos puros.Otra forma es usar una matriz como tipo, por ejemplo:
De esta manera, evita todas las molestias con el objeto Type, y si realmente necesita una lista, siempre puede convertir la matriz en una lista de la siguiente manera:
En mi humilde opinión, esto es mucho más legible.
Y para que sea una lista real (que se puede modificar, consulte las limitaciones de
Arrays.asList()
), haga lo siguiente:fuente
TypeFactory
como se describe en la siguiente respuesta: stackoverflow.com/a/42458104/91497 es la forma de Jackson de especificar el tipo.Esta variante parece más simple y elegante.
fuente
CollectionType
referencia explícita .Yo también tengo el mismo problema. Tengo un json que se convertirá a ArrayList.
La cuenta se ve así.
Todas las clases anteriores se han anotado correctamente. Probé TypeReference> () {} pero no funciona.
Me da Arraylist pero ArrayList tiene un LinkedHashMap que contiene algunos hashmaps más vinculados que contienen valores finales.
Mi código es el siguiente:
Finalmente resolví el problema. Puedo convertir la Lista en Json String directamente a ArrayList de la siguiente manera:
fuente
Esto funciona para mi.
fuente