Necesito convertir una determinada cadena JSON en un objeto Java. Estoy usando Jackson para el manejo de JSON. No tengo control sobre el JSON de entrada (lo leo de un servicio web). Este es mi JSON de entrada:
{"wrapper":[{"id":"13","name":"Fred"}]}
Este es un caso de uso simplificado:
private void tryReading() {
String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
ObjectMapper mapper = new ObjectMapper();
Wrapper wrapper = null;
try {
wrapper = mapper.readValue(jsonStr , Wrapper.class);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("wrapper = " + wrapper);
}
Mi clase de entidad es
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
Mi clase Wrapper es básicamente un objeto contenedor para obtener mi lista de alumnos:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Sigo recibiendo este error y "wrapper" devuelve null
. No estoy seguro de lo que se pierde. ¿Puede alguien ayudar, por favor?
org.codehaus.jackson.map.exc.UnrecognizedPropertyException:
Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
at [Source: java.io.StringReader@1198891; line: 1, column: 13]
(through reference chain: Wrapper["wrapper"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
.from(UnrecognizedPropertyException.java:53)
Puede utilizar la anotación a nivel de clase de Jackson:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
@JsonIgnoreProperties
class { ... }
Ignorará todas las propiedades que no hayas definido en tu POJO. Muy útil cuando sólo buscas un par de propiedades en el JSON y no quieres escribir todo el mapeo. Más información en Jackson's website. Si quieres ignorar cualquier propiedad no declarada, debes escribir:
@JsonIgnoreProperties(ignoreUnknown = true)
La primera respuesta es casi correcta, pero lo que se necesita es cambiar el método getter, NO el campo -- el campo es privado (y no se detecta automáticamente); además, los getters tienen preferencia sobre los campos si ambos son visibles. (Hay formas de hacer visibles los campos privados, también, pero si quieres tener getter no tiene mucho sentido)
Así que el getter debería llamarse getWrapper()
, o estar anotado con:
@JsonProperty("wrapper")
Si usted prefiere el nombre del método getter como es.
Jackson se está quejando porque no puede encontrar un campo en su clase Wrapper que se llame "wrapper". Lo hace porque su objeto JSON tiene una propiedad llamada "wrapper".
Creo que la solución es cambiar el nombre de su clase Wrapper por "wrapper" en lugar de "estudiantes".