Ich muss einen bestimmten JSON-String 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 von Schülern zu erhalten:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Ich erhalte ständig diesen Fehler und "wrapper" gibt null
zurück. Ich bin 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)
Sie können Jackson's class-level annotation verwenden:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
@JsonIgnoreProperties
class { ... }
Es wird jede Eigenschaft ignoriert, 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 Informationen auf Jackson's Website. Wenn Sie eine nicht deklarierte Eigenschaft ignorieren wollen, sollten Sie schreiben:
@JsonIgnoreProperties(ignoreUnknown = true)
Die erste Antwort ist fast richtig, aber was benötigt wird, ist die Getter-Methode zu ä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 Sie Getter haben wollen, macht das nicht viel Sinn)
Also sollte getter entweder getWrapper()
heißen, oder mit annotiert werden:
@JsonProperty("wrapper")
Wenn Sie den Namen der Getter-Methode so bevorzugen, wie er ist.
Jackson beschwert sich, weil es kein Feld in Ihrer Klasse Wrapper 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 der Klasse Wrapper in "wrapper" anstelle von "students" umzubenennen.