Ignorando nuevos campos en objetos JSON utilizando Jackson

Estoy usando la biblioteca Jackson JSON para convertir algunos objetos JSON en clases POJO en una aplicación de Android. El problema es que los objetos JSON pueden cambiar y agregarse nuevos campos mientras se publica la aplicación, pero actualmente se dividirá cuando se agregue un campo String simple, que se puede ignorar de forma segura.

¿Hay alguna manera de decirle a Jackson que ignore los campos recién agregados? (por ejemplo, no existente en los objetos POJO)? Un ignorar global sería genial.

Jackson proporciona una anotación que se puede usar en el nivel de clase ( JsonIgnoreProperties ).

Agregue lo siguiente al principio de su clase ( no a métodos individuales):

@JsonIgnoreProperties(ignoreUnknown = true) public class Foo { ... } 

Dependiendo de la versión de jackson que esté utilizando, deberá usar una importación diferente en la versión actual:

 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

en versiones anteriores, ha sido:

 import org.codehaus.jackson.annotate.JsonIgnoreProperties; 

Además de los dos mecanismos ya mencionados, también hay una función global que se puede usar para suprimir todas las fallas causadas por propiedades desconocidas (no asignadas):

 // jackson 1.9 and before objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); // or jackson 2.0 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

Este es el valor predeterminado que se usa en ausencia de anotaciones, y puede ser una alternativa conveniente.

Respuesta actualizada y completa con Jackson 2


Usando la anotación

 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties(ignoreUnknown = true) public class MyMappingClass { } 

Ver JsonIgnoreProperties en la documentación en línea de Jackson.

Usando la configuración

Menos intrusivo que la anotación.

 import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); ObjectReader objectReader = objectMapper.reader(MyMappingClass.class); MyMappingClass myMappingClass = objectReader.readValue(json); 

Ver FAIL_ON_UNKNOWN_PROPERTIES en la documentación en línea de Jackson.

se puede lograr de 2 maneras:

  1. Marque el POJO para ignorar las propiedades desconocidas

     @JsonIgnoreProperties(ignoreUnknown = true) 
  2. Configure ObjectMapper que serialice / De-serialice el POJO / json de la siguiente manera:

     ObjectMapper mapper =new ObjectMapper(); // for Jackson version 1.X mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); // for Jackson version 2.X mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 

Si usa una clase pojo basada en la respuesta JSON. Si hay posibilidades de que JSON cambie con frecuencia declarar a nivel de clase Pojo:

 @JsonIgnoreProperties(ignoreUnknown = true) 

y en objectMapper agrega esto si estás convirtiendo:

 objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

Entonces ese código no se romperá.

Asegúrese de colocar la @JsonIgnoreProperties(ignoreUnknown = true) en la clase padre POJO que desea rellenar como resultado de analizar la respuesta JSON y no la clase en la que se está realizando la conversión de JSON a objeto Java.

Comenzando con Jackson versión 2.4 y superior, ha habido algunos cambios. Así es como lo haces ahora:

 import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; 

………………………………………….. ……………………

  ObjectMapper mapper = new ObjectMapper(); // to prevent exception when encountering unknown property: mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 

Nota: La solución basada en @annotation sigue siendo la misma, por lo que si desea utilizarla, vea las otras respuestas.

For more information see the 10 minutes Configuration tutorial at: https://github.com/FasterXML/jackson-databind

Como se indicó anteriormente, las anotaciones solo funcionan si esto se especifica en la clase primaria POJO y no en la clase donde se está llevando a cabo la conversión de JSON a Java Object.

La otra alternativa sin tocar la clase principal y causar interrupciones es implementar su propia configuración del asignador solo para los métodos del asignador que necesita para esto.

También se ha movido el paquete de la función Deserialización. DeserializationConfig.FAIL_ON_UNKNOWN_PROPERTIES a DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES

 import org.codehaus.jackson.map.DeserializationConfig; ... objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

@JsonIgnoreProperties(ignoreUnknown = true) funcionó bien para mí. Tengo una aplicación java que se ejecuta en tomcat con jdk 1.7.

Estoy usando jackson-xxx 2.8.5.Maven Dependency como:

    com.fasterxml.jackson.core jackson-core 2.8.5    com.fasterxml.jackson.core jackson-annotations 2.8.5    com.fasterxml.jackson.core jackson-databind 2.8.5   

En primer lugar, si desea ignorar las propiedades desconocidas globalmente, puede configurar ObjectMapper .
Como abajo:

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

Si quiere ignorar alguna clase, puede agregar la anotación @JsonIgnoreProperties(ignoreUnknown = true) en su clase como:

 @JsonIgnoreProperties(ignoreUnknown = true) public class E1 { private String t1; public String getT1() { return t1; } public void setT1(String t1) { this.t1 = t1; } } 

Puede anotar la propiedad específica en su POJO con @JsonIgnore.