La documentación de enlace de datos de Jackson indica que Jackson admite la deserialización de "matrices de todos los tipos compatibles", pero no puedo entender la sintaxis exacta para esto.
Para un solo objeto, haría esto:
//json input
{
"id" : "junk",
"stuff" : "things"
}
//Java
MyClass instance = objectMapper.readValue(json, MyClass.class);
Ahora para una matriz, quiero hacer esto:
//json input
[{
"id" : "junk",
"stuff" : "things"
},
{
"id" : "spam",
"stuff" : "eggs"
}]
//Java
List<MyClass> entries = ?
Alguien sabe si falta un comando mágico? Si no, ¿cuál es la solución?
Respuestas:
Primero crea un mapeador:
Como matriz:
Como lista:
Otra forma de especificar el tipo de Lista:
fuente
JsonMappingException: No suitable constructor found for type
este, significa que necesita agregar un constructor predeterminado a su clase, agregando un constructor privado sin argumentos lo arregló para mí.static
; de lo contrario, nunca tendrán un constructor de cero argumentos.List<MyClass> myObjects = Arrays.asList(mapper.readValue(json, MyClass[].class))
funciona hasta 10 veces más rápido que TypeRefence.De Eugene Tskhovrebov
Esta solución parece ser la mejor para mí.
fuente
ResourceNotFoundException
Arrays.asList(Json.fromJson(json.get("fieldName"), MyClass[].class))
List<MyClass> myObjects = Arrays.asList(mapper.treeToValue(jsonNode.get("fieldName"), MyClass[].class))
Para implementación genérica:
fuente
Primero cree una instancia de ObjectReader que sea segura para subprocesos.
Entonces úsalo:
fuente
fuente
Aquí hay una utilidad que puede transformar json2object u Object2json, sea cual sea su pojo (entidad T)
fuente
También podría crear una clase que se extienda
ArrayList
:public static class MyList extends ArrayList<Myclass> {}
y luego úsalo como:
fuente
No pude usar esta respuesta porque mi linter no permitirá lanzamientos no verificados.
Aquí hay una alternativa que puede usar. Siento que en realidad es una solución más limpia.
fuente