Ich muss eine bestimmte JSON-Zeichenfolge in ein Java-Objekt konvertieren. Ich verwende Jackson für das JSON-Handling. Ich habe keine Kontrolle über die Eingabe JSON (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 Containerobjekt, um meine Schülerliste abzurufen:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Ich erhalte immer wieder diesen Fehler und "Wrapper" kehrt 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)
java
json
data-binding
jackson
jshree
quelle
quelle
Map dummy<String,Student> = myClientResponse.getEntity(new GenericType<Map<String, Student>>(){});
und dannStudent myStudent = dummy.get("wrapper");
Antworten:
Sie können Jacksons Annotation auf Klassenebene verwenden:
Alle Eigenschaften, die Sie in Ihrem POJO nicht definiert haben, werden ignoriert. Sehr nützlich, wenn Sie nur nach einigen Eigenschaften in JSON suchen und nicht die gesamte Zuordnung schreiben möchten. Weitere Infos auf Jacksons Website . Wenn Sie eine nicht deklarierte Eigenschaft ignorieren möchten, sollten Sie Folgendes schreiben:
quelle
(ignoreUnknown = true)
wenn Sie Ihre Klasse kommentieren, sonst wird es nicht funktionierenSie können verwenden
Alle nicht deklarierten Eigenschaften werden ignoriert.
quelle
Die erste Antwort ist fast richtig, aber es ist erforderlich, die Getter-Methode zu ändern, NICHT Feld - Feld ist privat (und nicht automatisch erkannt); Außerdem haben Getter Vorrang vor Feldern, wenn beide sichtbar sind. (Es gibt auch Möglichkeiten, private Felder sichtbar zu machen, aber wenn Sie Getter haben möchten, gibt es nicht viel Sinn.)
Daher sollte Getter entweder benannt
getWrapper()
oder mit folgenden Anmerkungen versehen werden:Wenn Sie den Namen der Getter-Methode so wie sie ist bevorzugen.
quelle
@JsonProperty
. Obwohl@JsonGetter
es sich um einen legalen Alias handelt, wird er selten als@JsonProperty
Arbeit für Getter, Setter und Felder verwendet. Setter und Getter können durch Signatur unterschieden werden (einer akzeptiert keine Argumente, gibt nicht ungültig zurück; der andere akzeptiert ein Argument).Mit Jackson 2.6.0 funktionierte dies für mich:
und mit Einstellung:
quelle
ObjectMapper
und dieFAIL_ON_UNKNOWN_PROPERTIES
Eigenschaft global festzulegen.Es kann auf zwei Arten erreicht werden:
Markieren Sie das POJO, um unbekannte Eigenschaften zu ignorieren
Konfigurieren Sie ObjectMapper, der das POJO / json wie folgt serialisiert / de-serialisiert:
quelle
Das hat bei mir einfach perfekt funktioniert
@JsonIgnoreProperties(ignoreUnknown = true)
Anmerkung nicht.quelle
Wrapper
Instanz zurück, in der die Schülerlistenull
leer oder leer ist.Dies funktioniert besser als alle Bitte beziehen Sie sich auf diese Eigenschaft.
quelle
Wenn Sie Jackson 2.0 verwenden
quelle
Laut Dokument können Sie ausgewählte Felder oder alle unbekannten Felder ignorieren:
quelle
Es hat bei mir mit folgendem Code funktioniert:
quelle
Das Hinzufügen von Setzern und Gettern löste das Problem . Ich war der Meinung, dass das eigentliche Problem darin bestand, wie man es löst, aber nicht, wie man den Fehler unterdrückt / ignoriert. Ich habe den Fehler " Nicht erkanntes Feld .. nicht als ignorierbar markiert .. " erhalten.
Obwohl ich die folgende Annotation über der Klasse verwende, war es nicht möglich, das json-Objekt zu analysieren und mir die Eingabe zu geben
Dann wurde mir klar, dass ich keine Setter und Getter hinzufügte, nachdem ich dem "Wrapper" und dem "Student" Setter und Getter hinzugefügt hatte, funktionierte es wie ein Zauber.
quelle
Jackson beschwert sich, weil er in Ihrer Klasse Wrapper kein Feld finden kann, das "Wrapper" heißt. Dies geschieht, weil Ihr JSON-Objekt eine Eigenschaft namens "Wrapper" hat.
Ich denke, die Lösung besteht darin, das Feld Ihrer Wrapper-Klasse in "Wrapper" anstelle von "Studenten" umzubenennen.
quelle
Ich habe die folgende Methode ausprobiert und sie funktioniert für das Lesen im JSON-Format mit Jackson. Verwenden Sie die bereits vorgeschlagene Lösung von: annotating getter with
@JsonProperty("wrapper")
Deine Wrapper-Klasse
Mein Vorschlag für eine Wrapper-Klasse
Dies würde Ihnen jedoch die Ausgabe des Formats geben:
Weitere Informationen finden Sie unter https://github.com/FasterXML/jackson-annotations
Hoffe das hilft
quelle
{}
Symbole in der Symbolleiste verwenden, um Ihre Codefragmente zu formatieren.Diese Lösung ist generisch beim Lesen von JSON-Streams und muss nur einige Felder abrufen, während Felder, die in Ihren Domänenklassen nicht korrekt zugeordnet sind, ignoriert werden können:
Eine detaillierte Lösung wäre die Verwendung eines Tools wie jsonschema2pojo, um die erforderlichen Domänenklassen wie Student automatisch aus dem Schema der json-Antwort zu generieren. Letzteres können Sie mit jedem Online-Konverter von JSON in Schema ausführen.
quelle
Kommentieren Sie die Feldschüler wie folgt, da die Namen der Eigenschaften json und java nicht übereinstimmen
quelle
Wie niemand sonst erwähnt hat, dachte ich würde ...
Problem ist, dass Ihre Eigenschaft in Ihrem JSON "Wrapper" heißt und Ihre Eigenschaft in Wrapper.class "Studenten" heißt.
Also entweder...
quelle
Setzen Sie Ihre Klassenfelder nicht privat auf öffentlich .
quelle
Was für mich funktionierte, war, das Eigentum öffentlich zu machen. Es hat das Problem für mich gelöst.
quelle
Entweder ändern
zu
---- oder ----
Ändern Sie Ihre JSON-Zeichenfolge in
quelle
Deine Eingabe
Gibt an, dass es sich um ein Objekt mit einem Feld namens "Wrapper" handelt, bei dem es sich um eine Sammlung von Schülern handelt. Meine Empfehlung wäre also:
wo
Wrapper
ist definiert alsquelle
Das neue Firebase Android brachte einige große Änderungen mit sich. unter der Kopie des Dokuments:
[ https://firebase.google.com/support/guides/firebase-android] :
Aktualisieren Sie Ihre Java-Modellobjekte
Wie beim 2.x SDK konvertiert Firebase Database automatisch Java-Objekte, an die Sie übergeben,
DatabaseReference.setValue()
in JSON und kann JSON mithilfe von in Java-Objekte lesenDataSnapshot.getValue()
.Wenn Sie im neuen SDK JSON in ein Java-Objekt mit lesen
DataSnapshot.getValue()
, werden unbekannte Eigenschaften im JSON jetzt standardmäßig ignoriert, sodass Sie sie nicht mehr benötigen@JsonIgnoreExtraProperties(ignoreUnknown=true)
.Um Felder / Getter beim Schreiben eines Java-Objekts in JSON auszuschließen, wird jetzt die Annotation
@Exclude
anstelle von aufgerufen@JsonIgnore
.Wenn Ihr JSON eine zusätzliche Eigenschaft enthält, die sich nicht in Ihrer Java-Klasse befindet, wird diese Warnung in den Protokolldateien angezeigt:
Sie können diese Warnung entfernen, indem Sie
@IgnoreExtraProperties
Ihrer Klasse eine Anmerkung hinzufügen. Wenn Sie möchten, dass sich die Firebase-Datenbank wie im 2.x SDK verhält und eine Ausnahme auslöst, wenn unbekannte Eigenschaften vorhanden sind, können Sie@ThrowOnExtraProperties
Ihrer Klasse eine Anmerkung hinzufügen.quelle
Für meinen Teil die einzige Zeile
@JsonIgnoreProperties(ignoreUnknown = true)
hat auch nicht funktioniert.
Einfach hinzufügen
Jackson 2.4.0
quelle
Das hat bei mir perfekt funktioniert
quelle
Ich habe dieses Problem behoben, indem ich einfach die Signaturen meiner Setter- und Getter-Methoden meiner POJO-Klasse geändert habe. Ich musste lediglich die getObject- Methode so ändern, dass sie dem entspricht , wonach der Mapper suchte. In meinem Fall hatte ich ursprünglich eine getImageUrl , aber die JSON-Daten hatten image_url, was den Mapper abwarf. Ich habe sowohl meinen Setter als auch meinen Getter in getImage_url und setImage_url geändert .
Hoffe das hilft.
quelle
Das POJO sollte definiert sein als
Antwortklasse
Wrapper-Klasse
und Mapper, um den Wert zu lesen
quelle
wrappers
aberwrapper
.Dies kann eine sehr späte Antwort sein, aber nur das Ändern des POJO in dieses sollte die im Problem bereitgestellte JSON-Zeichenfolge lösen (da die Eingabezeichenfolge nicht in Ihrer Kontrolle liegt, wie Sie sagten):
quelle
Eine andere Möglichkeit ist diese Eigenschaft in den application.properties
spring.jackson.deserialization.fail-on-unknown-properties=false
, für die keine weitere Codeänderung in Ihrer Anwendung erforderlich ist. Und wenn Sie glauben, dass der Vertrag stabil ist, können Sie diese Eigenschaft entfernen oder als wahr markieren.quelle
Dies ist möglicherweise nicht das gleiche Problem wie das OP, aber falls jemand mit dem gleichen Fehler wie ich hierher gekommen ist, hilft dies ihm, sein Problem zu lösen. Ich habe den gleichen Fehler wie beim OP erhalten, als ich einen ObjectMapper aus einer anderen Abhängigkeit als die JsonProperty-Annotation verwendet habe.
Das funktioniert:
Funktioniert nicht:
quelle
Google hat mich hierher gebracht und ich war überrascht, die Antworten zu sehen ... alle schlugen vor , den Fehler zu umgehen ( der später in der Entwicklung immer 4-fach zurückbeißt ), anstatt ihn zu lösen, bis dieser Gentleman durch das Vertrauen in SO wiederhergestellt wurde!
wird verwendet, um einen json-String in ein Klassenobjekt zu konvertieren. Was fehlt, ist, dass der
TargetClass
öffentliche Terget
/ ter haben sollteset
. Gleiches fehlt auch im Fragefragment von OP! :) :)via lombok sollte deine klasse wie unten funktionieren !!
quelle
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties
quelle