1019 Stimmen

Jackson mit JSON: Unerkanntes Feld, nicht als ignorierbar markiert

Ich muss eine bestimmte JSON-Zeichenfolge in ein Java-Objekt konvertieren. Ich verwende Jackson für die JSON-Verarbeitung. Ich habe keine Kontrolle über die JSON-Eingabe (ich lese von einem Webdienst). Dies ist meine Eingabe JSON:

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

Hier ist ein vereinfachter Anwendungsfall:

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

Meine Entitätsklasse ist:

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

Meine Wrapper-Klasse ist im Grunde ein Container-Objekt, um meine Liste der Schüler zu erhalten:

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

Ich erhalte immer wieder diesen Fehler und "wrapper" gibt zurück null . Ich bin mir nicht sicher, was fehlt. Kann mir bitte jemand helfen?

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)

1413voto

Ariel Kogan Punkte 12773

Sie können Jacksons Annotation auf Klassenebene verwenden:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties

@JsonIgnoreProperties
class { ... }

Es wird jede Eigenschaft ignorieren, die Sie nicht in Ihrem POJO definiert haben. Sehr nützlich, wenn Sie nur nach ein paar Eigenschaften im JSON suchen und nicht das ganze Mapping schreiben wollen. Mehr Infos unter Jacksons Website . Wenn Sie eine nicht deklarierte Eigenschaft ignorieren wollen, sollten Sie schreiben:

@JsonIgnoreProperties(ignoreUnknown = true)

767voto

Suresh Punkte 7117

Sie können verwenden

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

Alle Eigenschaften, die nicht deklariert sind, werden ignoriert.

158voto

StaxMan Punkte 107669

Die erste Antwort ist fast richtig, aber man muss die Getter-Methode ändern, NICHT das Feld - das Feld ist privat (und wird nicht automatisch erkannt); außerdem haben Getter Vorrang vor Feldern, wenn beide sichtbar sind. (Es gibt Möglichkeiten, private Felder auch sichtbar zu machen, aber wenn man Getter haben will, hat das nicht viel Sinn)

Getter sollte also entweder den Namen getWrapper() oder mit einem Vermerk versehen:

@JsonProperty("wrapper")

Wenn Sie Getter-Methodennamen bevorzugen, wie sie sind.

150voto

Scott Punkte 1388

Mit Jackson 2.6.0 hat das bei mir funktioniert:

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

und mit Einstellung:

@JsonIgnoreProperties(ignoreUnknown = true)

84voto

Amit Kaneria Punkte 4872

Dies kann auf 2 Arten erreicht werden:

  1. Markieren Sie das POJO, um unbekannte Eigenschaften zu ignorieren

    @JsonIgnoreProperties(ignoreUnknown = true)
  2. Konfigurieren Sie ObjectMapper, der die POJO/json wie unten beschrieben serialisiert/deserialisiert:

    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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X