Ich benutze Feder 3.1.2 und ich muss ein JSON-Objekt in POJO parsen. Dies ist der JSON, den ich analysieren muss:
%Vor%Ich muss dieses json-Objekt (das aus zwei Objekten kombiniert wird) in ein POJO konvertieren, hier ist es:
%Vor% Dafür habe ich ObjectMapper mapper = new ObjectMapper();
benutzt
Jetzt, da ich mehrere JSON-Objekte habe, sieht mein Code so aus:
Wenn ich das ausführe - bekomme ich die folgende Ausnahme:
%Vor% Ich habe versucht, ein einfaches POJO - Person
:
und machen Sie folgendes:
%Vor%Ich bekomme diese (gleiche) Ausnahme:
%Vor%Ich habe versucht, etwas über die Informationen zu lesen - aber ich konnte es nicht verstehen Wie kann es mir hier helfen?
Wie kann ich dieses json in mein POJO umwandeln?
Danke.
Was ich getan habe, war folgendes: Ich habe eine neue Klasse erstellt, die ein Person-Objekt und ein Dog-Objekt enthält. Diese Klassen müssen statisch sein (ich fand es hier ). Hier sind die Klassen:
%Vor%Nun sieht mein Code so aus:
%Vor%Ich möchte es immer noch machen, ohne diese zwei Objekte zu erschaffen (Person und Hund) - Das ist jetzt gut genug - aber wenn jemand eine Idee hat - ich würde gerne hier sein!
Danke.
Das Problem ist das gleiche wie hier beschrieben: Jackson Fehler: kein geeigneter Konstruktor
Die Klasse, die Sie instanziieren möchten, ist nicht statisch. Aus diesem Grund hat es einen versteckten Konstruktorparameter. Dies führt dazu, dass Jackson versagt.
Versuchen Sie, den Konstruktor von MyClass so zu ändern, dass String
für alle Felder akzeptiert wird, da alle Felder Zeichenfolgen in Ihren JSON-Daten sind. Übrigens gibt es in JSON keine Standarddarstellung für TimeStamps, daher müssen Sie ohnehin eine Konvertierung für Datumsfelder durchführen. Für das Feld "Preis" könnten Sie versuchen,
bis
%Vor%in den JSON-Daten; das sollte es erlauben, als BigDecimal gelesen zu werden.
Wenn Sie Ihre beiden JSON-Objekte zu einem einzigen Java-Objekt kombinieren möchten, finden Sie hier eine Lösung mit der Genson-Bibliothek Ссылка . Der folgende Code könnte gekürzt werden und Gensons-Standardkonverter verwenden, aber es wäre weniger klar als ein Beispiel. Der Vorteil hier ist, dass Sie die Streaming-API direkt verwenden, so dass es sehr schnell ist.
%Vor%Wenn Sie andere Beispiele möchten, in denen Sie Person und Hund als getrennte Objekte haben, können Sie in der Gensons-Benutzergruppe nachfragen.
Hoffe, das hilft!
BEARBEITEN Hier ist eine andere Version kürzer und schöner aber nicht enthalten in der veröffentlichten Version 0.91 (Ich werde wahrscheinlich die neue Version heute veröffentlichen, da ich der Autor bin :)) Damit es funktioniert, müssen Sie Ihre Getter (und Setter, wenn Sie auch Serialisierung durchführen) mit @JsonProperty (the_name_from_json) annotieren. Beachten Sie, dass Genson keinen Getter / Setter benötigt, wenn Sie möchten, dass es nur die Felder verwendet (standardmäßig verwendet es Getter / Setter, falls das Feld anderweitig verfügbar ist).
%Vor%Hinweis: Ich bin der EclipseLink JAXB (MOXy) Leitung und Mitglied der JAXB (JSR-222) Expertengruppe.
Sie könnten das pfadbasierte Mapping in MOXy nutzen, um Ihren Anwendungsfall zu unterstützen.
MeineKlasse
Die Annotation @XmlPath
wird verwendet, um das pfadbasierte Mapping anzugeben:
jaxb.properties
Um MOXy als Ihren JAXB-Provider anzugeben, müssen Sie eine Datei mit dem Namen jaxb.properties
im selben Paket wie Ihr Domänenmodell mit dem folgenden Eintrag einfügen:
Demo
Der folgende Code konvertiert den JSON in Objekte und dann zurück in JSON.
%Vor%input.xml / Ausgabe
Nachfolgend finden Sie die Eingabe und Ausgabe des Demo-Codes. In meinem Beispiel benutze ich MOXys Standard-Repräsentation von Timestamp
. Sie können diese Darstellung einfach mit XmlAdapter
steuern (siehe: jaxb unmarshal timestamp ) .
All diese Antworten implizieren, dass die Verwendung eines POJO der einzige Weg ist, dies zu tun. Offensichtlich ist es in einem Web-Projekt, wie einem Spring-Web-Service-Projekt, wichtig, POJOs zu haben, aber nur für Komponententests könnten Sie nicht einfach ein generisches Jackson JsonNode-Objekt verwenden?
Können Sie nicht einfach mithilfe von Jackson ObjectMapper in einen JsonNode deserialisieren, ohne eine POJO-Klasse zu verwenden? Ist eine Instanz von JsonNode nicht selbst ein legaler Jackson POJO? Ich bin mir sicher, dass dies der Fall ist, denn sobald Sie eine JsonNode-Instanz haben, können Sie Objekte im JSON wie folgt erhalten:
%Vor%