Question 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, non existant sur les objets POJO)? Un ignorant global serait génial.


463
2018-03-28 05:26


origine


Réponses:


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

Ajoutez ce qui suit en haut de votre classe (ne pas aux méthodes individuelles):

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

Selon la version jackson que vous utilisez, vous devez 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;

693
2018-03-28 06:52



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 une solution de repli pratique.


361
2018-03-28 17:52



À jour et complète réponse avec Jackson 2


Utilisation de l'annotation

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyMappingClass {

}

Voir JsonIgnoreProperties sur la documentation en ligne 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 Jackson.


91
2017-09-08 06:27



cela peut être réalisé de 2 façons:

  1. Marquez 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) 
    

40
2017-08-17 19:37



Si vous utilisez une classe pojo basée sur la réponse JSON. Si les chances sont là que les changements json déclarent fréquemment au niveau de la classe pojo:

@JsonIgnoreProperties(ignoreUnknown = true)

et à l'objectMapper ajoutez ceci si vous convertissez:

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

Donc, ce code ne cassera pas.


23
2017-12-03 17:08



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


17
2018-04-03 07:32



À partir de Jackson version 2.4 et supérieure, il y a eu quelques changements. 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 reste la même, donc si vous souhaitez l'utiliser, consultez les autres réponses.

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


12
2017-12-06 10:28



Comme indiqué ci-dessus, les annotations ne fonctionnent que si cela est spécifié dans la classe POJO parente et non dans la classe où la conversion de JSON à Java Object a lieu.

L'autre alternative sans toucher à la classe parente et causer des perturbations est d'implémenter votre propre configuration de mappeur uniquement pour les méthodes de mappeur dont vous avez besoin pour cela.

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

10
2017-09-26 18:49



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

<dependencies>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.5</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.5</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.5</version>
    </dependency>

</dependencies>

D'abord, si vous voulez ignorer les propriétés inconnues globalement. Vous pouvez config ObjectMapper.
Comme ci-dessous:

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

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

@JsonIgnoreProperties(ignoreUnknown = true)
public class E1 {

    private String t1;

    public String getT1() {
        return t1;
    }

    public void setT1(String t1) {
        this.t1 = t1;
    }
}

7
2017-12-20 02:57