Wie konvertieren von json in POJO in java mit jackson
Ich bin mit spring 3.1.2, und ich muss zum Parsen eines json-Objekts in POJO.
Das ist der json-das muss ich analysieren:
{
"Person" : {
"id" : "2"
},
"Dog" : {
"dateOfBirth" : "2012-08-20 00:00:00",
"price" : "10.00"
}
}
Ich brauche zu konvertieren, das json-Objekt (die ist zusammengesetzt aus zwei Objekten) in ein POJO, hier ist es:
public class MyClass{
public MyClass(){}
public MyClass(String personsId, TimeStamp dogsDateOfBirth, BigDecimal dogsPrice){
.... //assign each parameter to the appropriate field
}
private String personsId;
private TimeStamp dogsDateOfBirth;
private BigDecimal dogsPrice;
//... Getters and Setters for each field
}
Für diese Angelegenheit, die ich verwendet ObjectMapper mapper = new ObjectMapper();
Nun da habe ich mehrere json-Objekte mein code sieht wie folgt aus:
String json = ... ;//A json with several objects as above
JsonNode tree = mapper.readTree(json);
Iterator<JsonNode> iter = tree.path("data").getElements();
while (iter.hasNext()){
JsonNode node = iter.next();
MyClass myClass = mapper.readValue(node, MyClass.class);
... //do something with myClass object
}
Wenn ich diese ausführe - bekomme ich die folgende exception:
org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class ...MyClass]: can not instantiate from JSON object (need to add/enable type information?)
Ich habe versucht, zu erstellen eine einfache POJO - Person
:
public class Person{
private String id;
public Person(){}
public Person(String id){
this.id = id;
}
... //Getter and Setter
}
die folgenden Schritte aus:
Person person = mapper.readValue(node.path("Person"), Person.class);
Bekomme ich diese (gleiche) Ausnahme:
org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class ...Person]: can not instantiate from JSON object (need to add/enable type information?)
Habe ich versucht zu Lesen, die über die geben Sie Informationen - konnte aber nicht verstehen, wie es kann mir hier helfen.
Wie kann ich umwandeln dieses json in mein POJO?
Dank.
- haben Sie versucht, das entfernen Ihrer speziellen Konstruktor und nur mit dem no-args? Sieht aus wie es ist irgendwie immer verwirrt über Ihre Konstruktoren.
- Ja das habe ich versucht - aber ich bekomme immer noch die gleiche exception.
- Ich habe versucht, um dieses Problem zu reproduzieren, aber ich kann nicht. Ich bin mit der jackson von fasterxml jedoch nicht von codehaus. Ich lese das json direkt aus dem string anstelle der aus dem Knoten. Das funktioniert für die person, Beispiel. Für die andere ist es nicht, da haben Sie diese seltsame Kombination von Gegenständen gibt. Sie werden wahrscheinlich verwenden, dazwischen Darstellung.
- Hi - ich habe gerade versucht mapping aus einem string (
{"id":"2"}
) und es immer noch nicht funktioniert - die gleiche Ausnahme. - Folgendes funktioniert bei mir:
MyClass myClass = new ObjectMapper().readValue("{\"id\" : \"2\" }".getBytes(), MyClass.class)
mit MyClass eine einfache bean mit einem String-Feld: id. - Hallo, ich gepostet eine Antwort - bitte werfen Sie einen Blick.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ich Tat, war dies:
Ich habe eine neue Klasse, die hält ein Person-Objekt und Hund-Objekt, diese Klassen muss statisch sein ( ich fand es hier ).
Hier sind die Klassen:
Nun mein code sieht wie folgt aus:
Will ich noch tun, ohne in die Erstellung dieser beiden Objekte ( Mensch und Hund ) -, Dass a gut genug für jetzt - aber wenn jemand eine Idee - ich würde gerne hier!
Dank.
Das problem ist das gleiche, wie hier beschrieben : Jackson Fehlermeldung: kein passender Konstruktor
Klasse, dass du versuchst zu instanziieren ist nicht statisch. Weil das so ist, es hat einen versteckten parameter des Konstruktors. Dies führt Jackson zu scheitern.
Ändern Sie den Konstruktor von MyClass zu akzeptieren
String
für alle Felder, da alle Felder sind strings im JSON-Daten. BTW, es gibt keine standard-Darstellung für Zeitstempel im JSON-Format, so müssen Sie eine Konvertierung für die Felder Datum, sowieso. Für die "Preis" - Feld, Sie könnten versuchen Siezu
in der JSON-Daten; das sollte es erlauben, es zu Lesen, wie BigDecimal.
Person
Objekt dieser Klasse hat nur ein Feld, das ist String.Wenn Sie möchten, kombinieren Sie Ihre zwei json-Objekten in einer einzigen java-Objekt hier ist eine Lösung mit Genson-Bibliothek http://code.google.com/p/genson/.
Der folgende code kann verkürzt werden und die Nutzung Gensons standard-Konverter, aber Es wäre weniger klar, als ein Beispiel. Der Vorteil hier ist, dass Sie mit der streaming-api direkt so ist es sehr schnell.
Wenn Sie möchten, dass andere Beispiele, wo Sie Mensch und Hund als getrennte Objekte, die Sie Fragen können auf Gensons user group.
Hoffe, das hilft!
BEARBEITEN
Hier ist eine andere version, die kürzer und schöner, aber nicht enthalten in der veröffentlichten version 0.91 (werde ich wahrscheinlich mit der neuen version heute, als ich bin der Autor :))
Damit es funktioniert, müssen Sie, um Anmerkungen in Ihren Getter (und setter, wenn Sie auch tun, Serialisierung) mit @JsonProperty(the_name_from_json). Beachten Sie, dass Genson braucht keine getter/setter, wenn Sie es wollen, benutzen Sie nur die Felder (standardmäßig verwendet getter/setter, wenn verfügbar, sonst das Feld).
Hinweis: ich bin der EclipseLink JAXB (MOXy) führen und ein Mitglied der JAXB (JSR-222) expert group.
Könnten Sie nutzen die Pfad-basierte Zuordnung in MOXy zu unterstützen, Ihren Fall.
MyClass
Den
@XmlPath
annotation wird verwendet, um die Pfad-basierte Zuordnung:jaxb.Eigenschaften
Angeben, MOXy, wie Ihr JAXB-provider Sie brauchen, um enthalten eine Datei namens
jaxb.properties
im gleichen Paket wie Ihr domain-Modell mit den folgenden Eintrag:Demo
Den code unten konvertieren der JSON-Objekte, und dann zurück zu JSON.
Eingang.xml - /Ausgabe
Unten ist die Eingabe in und Ausgabe aus der Ausführung der demo-code. In meinem Beispiel bin ich mit MOXy s Standard reprentation von
Timestamp
. Können Sie diese Darstellung leicht mit einemXmlAdapter
(siehe: jaxb unmarshal-timestamp).All diese Antworten implizieren, dass die Verwendung eines POJO ist der einzige Weg, es zu tun. Offensichtlich, in einem web-Projekt, wie eine Feder, web-services-Projekt, ist es wichtig, POJO ' s, aber nur für unit-tests könntest du nicht einfach ein generischer Jackson JsonNode Objekt?
Kannst du nicht einfach de-serialisieren in eine JsonNode mit Jackson-ObjectMapper ohne ein POJO-Klasse? Nicht eine Instanz von JsonNode qualifizieren als juristische Jackson POJO selbst? Ich bin mir sicher, dass es tut, weil, sobald Sie eine JsonNode Instanz, die Sie bekommen können Objekte in json wie: