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)

20voto

j_bond007 Punkte 171

Bei mir hat es mit dem folgenden Code funktioniert:

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

19voto

mytwocentsads Punkte 171

Ich habe die folgende Methode ausprobiert, und es funktioniert für solche JSON-Format Lesen mit Jackson. Verwenden Sie die bereits vorgeschlagene Lösung von: annotating getter with @JsonProperty("wrapper")

Ihre Wrapper-Klasse

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

Mein Vorschlag für eine Wrapper-Klasse

public Class Wrapper{ 

  private StudentHelper students; 

  //getters & setters here 
  // Annotate getter
  @JsonProperty("wrapper")
  StudentHelper getStudents() {
    return students;
  }  
} 

public class StudentHelper {

  @JsonProperty("Student")
  public List<Student> students; 

  //CTOR, getters and setters
  //NOTE: If students is private annotate getter with the annotation @JsonProperty("Student")
}

Dadurch erhalten Sie jedoch die Ausgabe des Formats:

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

Weitere Informationen finden Sie auch unter https://github.com/FasterXML/jackson-annotations

19voto

Jim Ferrans Punkte 29952

Jackson beschwert sich, weil es in Ihrer Klasse Wrapper kein Feld mit dem Namen "wrapper" finden kann. Er tut dies, weil Ihr JSON-Objekt eine Eigenschaft namens "wrapper" hat.

Ich denke, die Lösung besteht darin, das Feld Ihrer Wrapper-Klasse in "Wrapper" statt in "Studenten" umzubenennen.

16voto

Pirate Punkte 2526

Wenn Sie sich bewerben möchten @JsonIgnoreProperties zu allen Klassen in Ihrer Anwendung dann der beste Weg ist es überschreiben Spring Boot Standard-Jackson-Objekt.

Definieren Sie in Ihrer Anwendungskonfigurationsdatei eine Bean, um den Jackson Object Mapper wie folgt zu erstellen.

@Bean
    public ObjectMapper getObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return mapper;
    }

Jetzt müssen Sie nicht mehr jede Klasse markieren und alle unbekannten Eigenschaften werden ignoriert.

14voto

Diese Lösung ist generisch, wenn Sie Json-Streams lesen und nur einige Felder abrufen müssen, während Felder, die in Ihren Domänenklassen nicht korrekt zugeordnet sind, ignoriert werden können:

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

Eine detaillierte Lösung wäre die Verwendung eines Tools wie jsonschema2pojo zur automatischen Generierung der erforderlichen Domänenklassen wie z. B. Student aus dem Schema der json Response. Letzteres können Sie mit einem beliebigen Online-Json-Schema-Konverter tun.

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