Ignorer les nouveaux champs sur les objects JSON à l’aide de Jackson

J’utilise la bibliothèque Jackson JSON pour convertir certains objects JSON en classes POJO sur une application Android. Le problème est que les objects JSON peuvent changer et que de nouveaux champs sont ajoutés pendant la publication de l’application, mais actuellement, ils seront endommagés lorsqu’un simple champ Ssortingng sera ajouté, ce qui peut être ignoré en toute sécurité.

Est-il possible de dire à Jackson d’ignorer les nouveaux champs ajoutés? (par exemple non existant sur les objects POJO)? Une ignorance globale serait formidable.

Jackson fournit une annotation pouvant être utilisée au niveau de la classe ( JsonIgnoreProperties ).

Ajoutez les éléments suivants en haut de votre classe ( pas aux méthodes individuelles):

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

Selon la version de jackson que vous utilisez, vous devrez utiliser une importation différente dans la version actuelle:

 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

dans les anciennes versions, il a été:

 import org.codehaus.jackson.annotate.JsonIgnoreProperties; 

En plus de deux mécanismes déjà mentionnés, il existe également une fonctionnalité globale qui peut être utilisée pour supprimer toutes les défaillances causées par des propriétés inconnues (non cartographiées):

 // 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); 

Ceci est la valeur par défaut utilisée en l’absence d’annotations et peut être une solution de repli pratique.

Réponse complète et à jour avec Jackson 2


Utiliser l’annotation

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

Voir JsonIgnoreProperties sur la documentation en ligne de Jackson.

Utiliser la configuration

Moins intrusif que l’annotation.

 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); 

Voir FAIL_ON_UNKNOWN_PROPERTIES sur la documentation en ligne de Jackson.

il peut être réalisé de deux manières:

  1. Marquer le POJO pour ignorer les propriétés inconnues

     @JsonIgnoreProperties(ignoreUnknown = true) 
  2. Configurez ObjectMapper qui sérialise / désérialise le POJO / json comme ci-dessous:

     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 vous utilisez une classe pojo basée sur une réponse JSON. S’il y a des chances que les modifications JSON déclarent fréquemment au niveau de la classe pojo:

 @JsonIgnoreProperties(ignoreUnknown = true) 

et à objectMapper ajoutez ceci si vous convertissez:

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

Donc, ce code ne sera pas cassé.

Assurez-vous de placer l’ @JsonIgnoreProperties(ignoreUnknown = true) dans la classe POJO parente que vous souhaitez renseigner en analysant la réponse JSON et non la classe où la conversion de l’object JSON en object Java est en cours.

À partir de la version 2.4 de Jackson et au-dessus, il y a eu quelques modifications. Voici comment vous le faites maintenant:

 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); 

Remarque: La solution basée sur @annotation rest la même, donc si vous souhaitez l’utiliser, consultez les autres réponses.

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

Comme indiqué ci-dessus, les annotations ne fonctionnent que si elles sont spécifiées dans la classe POJO parente et non dans la classe où la conversion de l’object JSON en object Java est en cours.

L’autre alternative sans toucher à la classe parente et provoquer des perturbations consiste à implémenter votre propre configuration de mappeur uniquement pour les méthodes de mappage dont vous avez besoin.

Le package de la fonctionnalité de désérialisation a également été déplacé. DeserializationConfig.FAIL_ON_UNKNOWN_PROPERTIES à DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES

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

@JsonIgnoreProperties(ignoreUnknown = true) a bien fonctionné pour moi. J’ai une application java qui fonctionne sur tomcat avec jdk 1.7.

J’utilise jackson-xxx 2.8.5.Maven Dependency comme:

    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   

Tout d’abord, si vous souhaitez ignorer globalement les propriétés inconnues, vous pouvez configurer ObjectMapper .
Comme ci-dessous:

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

Si vous voulez ignorer une classe, vous pouvez append une annotation @JsonIgnoreProperties(ignoreUnknown = true) à votre classe, comme @JsonIgnoreProperties(ignoreUnknown = true) :

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

Vous pouvez annoter la propriété spécifique dans votre POJO avec @JsonIgnore.