Question Jackson avec JSON: champ non reconnu, non marqué comme ignorable


J'ai besoin de convertir une certaine chaîne JSON en un objet Java. J'utilise Jackson pour la gestion JSON. Je n'ai aucun contrôle sur l'entrée JSON (je lis depuis un service Web). C'est mon entrée JSON:

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

Voici un cas d'utilisation simplifié:

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

Ma classe d'entité est:

public Class Student { 
    private String name;
    private String id;
    //getters & setters for name & id here
}

Ma classe Wrapper est essentiellement un objet conteneur pour obtenir ma liste d'étudiants:

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

Je continue à recevoir cette erreur et "wrapper" retourne null. Je ne suis pas sûr de ce qui manque. Quelqu'un peut-il aider s'il vous plaît?

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)

459
2017-12-20 04:02


origine


Réponses:


Vous pouvez utiliser l'annotation de niveau classe de Jackson:

@JsonIgnoreProperties

Il ignorera toutes les propriétés que vous n'avez pas définies dans votre POJO. Très utile lorsque vous recherchez simplement quelques propriétés dans le JSON et que vous ne souhaitez pas écrire l'intégralité du mappage. Plus d'infos à Le site de Jackson. Si vous voulez ignorer toute propriété non déclarée, vous devez écrire:

@JsonIgnoreProperties(ignoreUnknown = true)

723
2017-09-25 14:13



Vous pouvez utiliser

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

Il ignorera toutes les propriétés non déclarées.


317
2017-10-04 15:27



La première réponse est presque correcte, mais ce qu'il faut, c'est changer la méthode getter, le champ NOT - le champ est privé (et non détecté automatiquement); de plus, les getters ont préséance sur les champs si les deux sont visibles (il y a des façons de rendre les champs privés visibles aussi, mais si vous voulez avoir getter il n'y a pas beaucoup de points)

Donc, getter devrait soit être nommé getWrapper(), ou annoté avec:

@JsonProperty("wrapper")

Si vous préférez le nom de la méthode getter tel quel.


105
2017-12-21 19:01



en utilisant Jackson 2.6.0, cela a fonctionné pour moi:

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

et avec réglage:

@JsonIgnoreProperties(ignoreUnknown = true)

56
2017-08-11 03:59



Cela a parfaitement fonctionné pour moi

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

@JsonIgnoreProperties(ignoreUnknown = true) l'annotation n'a pas.


38
2017-08-13 08:19



Cela fonctionne mieux que tout s'il vous plaît se référer à cette propriété.

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

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    projectVO = objectMapper.readValue(yourjsonstring, Test.class);

32
2018-02-03 17:01



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) 
    

30
2018-01-07 19:07



Si vous utilisez Jackson 2.0

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

26
2018-02-01 17:03



Selon le doc vous pouvez ignorer les champs sélectionnés ou tous les champs inconnus:

 // to prevent specified fields from being serialized or deserialized
 // (i.e. not include in JSON output; or being set even if they were included)
 @JsonIgnoreProperties({ "internalId", "secretKey" })

 // To ignore any unknown properties in JSON input without exception:
 @JsonIgnoreProperties(ignoreUnknown=true)

15
2017-12-01 23:32



Cela a fonctionné pour moi avec le code suivant:

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

14
2017-12-20 04:10