216 votos

Jackson con JSON: No campo, no marcados como ignorable

Necesito convertir una determinada cadena JSON a un objeto de Java. Estoy usando Jackson para el manejo de JSON. Yo no tengo ningún control sobre la entrada JSON (que he leído de un servicio web). Esta es mi entrada JSON:

{"wrapper":[{"id":"13","name":"Fred"}]}

Aquí es una versión simplificada de casos de uso:

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 de Contenedor es básicamente un contenedor de objeto de obtener mi lista de estudiantes:

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

Sigo recibiendo este error y de "contenedor" vuelve null. No estoy seguro de lo que falta. Alguien puede ayudarme 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)

407voto

Ariel Kogan Puntos 2371

Usted puede utilizar Jackson nivel de clase de anotación:

@JsonIgnoreProperties

Se va a ignorar a todas las propiedades que no se ha definido en su POJO. Muy útil cuando usted está buscando un par de propiedades en el JSON y no quiere escribir la totalidad de la asignación. Más info en Jackson sitio web. Si desea ignorar no declarado de la propiedad, usted debe escribir:

@JsonIgnoreProperties(ignoreUnknown = true)

137voto

Suresh Puntos 1043

Usted puede usar

ObjectMapper objectMapper = getObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Va a ignorar a todas las propiedades que no son declarados.

71voto

StaxMan Puntos 34626

La primera respuesta es casi correcto, pero lo que se necesita es cambiar el método getter, NO campo-campo es privado (y no auto-detecta); además, los captadores tienen prioridad sobre los campos, si ambos son visibles. (hay maneras de hacer que los campos privados visibles, demasiado, pero si usted quiere tener getter no hay mucho punto)

Así captador debe ser nombrado "getWrapper()", o anotado con:

@JsonProperty("wrapper")

si prefieres el método getter nombre como es.

25voto

Felix Kimutua Puntos 111

Esta perfectamente trabajado para mí

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(
    DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

@JsonIgnoreProperties(ignoreUnknown = true) anotación no.

17voto

Aalkhodiry Puntos 561

Si usted está usando Jackson 2.0

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X