670 votes

Ignorer les nouveaux champs sur les objets JSON en utilisant Jackson

J'utilise la bibliothèque Jackson JSON pour convertir certains objets JSON en classes POJO sur une application Android. Le problème est que les objets JSON peuvent changer et que de nouveaux champs peuvent être ajoutés pendant la publication de l'application, mais actuellement, il va s'arrêter même quand un simple champ String est ajouté, ce qui peut être ignoré en toute sécurité.

Est-il possible de dire à Jackson d'ignorer les champs nouvellement ajoutés? (par exemple inexistant sur les objets POJO)? Un ignorant global serait génial.

931voto

Hadi Eskandari Points 5344

il semble qu'il y ait une annotation qui peut être utilisée au niveau de la classe.

Ajoutez ce qui suit en haut de votre classe:

 import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
 

514voto

StaxMan Points 34626

En plus des 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 mappé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 un moyen de repli pratique.

130voto

Yves M. Points 1439

Jusqu'à la date de réponse complète et avec Jackson 2


À L'Aide De L'Annotation

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyMappingClass {

}

Voir JsonIgnoreProperties sur Jackson documentation en ligne.

À L'Aide De 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 Jackson documentation en ligne.

17voto

Rushi Shah Points 126

Veillez à placer l'annotation @JsonIgnoreProperties(ignoreUnknown = true) dans la classe POJO parente que vous voulez remplir à la suite de l'analyse de la réponse JSON et non dans la classe où la conversion de JSON vers l'objet Java a lieu.

11voto

mekdev Points 31

Comme indiqué plus haut, les annotations ne fonctionne que si cela est spécifié dans le parent de la classe POJO et pas de la classe où la conversion de JSON pour Objet Java.

L'autre alternative, sans toucher à la classe parent et de causer des perturbations sont à mettre en place votre propre mappeur de config uniquement pour le mappeur de méthodes que vous avez besoin pour cela.

Aussi l'ensemble de la Désérialisation fonctionnalité a été déplacé. DeserializationConfig.FAIL_ON_UNKNOWN_PROPERTIES à DeserializationConfig.Fonctionnalité.FAIL_ON_UNKNOWN_PROPERTIES

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X