Generische Objektserialisierung in Jackson mit Java
Ich würde gerne Lesen Sie in der Zeichenfolge {"a": 1.0}
als generische Java-Objekt, während die gleiche string-format. Jedoch, wenn ich versuche, Jackson ändert sich automatisch die interne Darstellung zu {a = 1}
. In anderen Worten, wie kann ich den folgenden code zum drucken {"a": 1.0}
statt {a = 1}
? Beachten Sie, dass ich habe, es zu Lesen, wie ein Object
(durch andere Programm-Einschränkungen).
import org.codehaus.jackson.map.ObjectMapper;
public class Main {
public static void main(String[] args) {
try
{
ObjectMapper mapper = new ObjectMapper();
Object myObject = mapper.readValue("{\"a\": 1.0}", Object.class);
System.out.println(myObject.toString());
}
catch (Exception e)
{
e.printStackTrace();
System.err.println(e.getMessage());
}
}
}
- Das ergibt keinen Sinn für mich. Objekt hat keine Eigenschaften für die Taste "a", wie kann es also sein, Lesen Sie in der wie dass? Nicht Sie müssen erstellen Sie eine Klasse mit dieser Eigenschaft?
- Vielleicht ist er unter der Annahme Jackson irgendwie telepathisch Figuren aus erwarteten Typ... was tatsächlich passiert ist, dass Typ Object.class spezielle Umgang mit Jackson: es werden "Natürliche" Zuordnung zu den Karten, Listen und wrapper-Typen (die sind alle Gegenstände natürlich)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das erstellte Objekt wird eine Karte (wie auch die anderen Kommentare) und so seine
toString
produziert, was Sie sehen,{a = 1}
. Um Ihren code zu drucken etwas näher zu Ihrer Eingabe Wert, den Sie verwenden müssen, um Jackson zu schreiben, es wieder aus mit etwas wie:Gibt mir das was ich glaube, was du suchst:
In anderen Worten, Jackson hat deserialisiert Ihre Eingabe-Zeichenfolge in einem beliebigen Java-Objekt. Wenn Sie anrufen
toString
auf das Objekt, seine eigenentoString
ist, natürlich, verwendet. Dieses schreiben können Sie das Objekt aber es gefällt, einschließlich der Verwendung der Methode vonObject
. Zur Reproduktion der Eingabe-Zeichenfolge, die Sie verwenden müssen, Jackson zu serialisieren unser Objekt wieder heraus.Müssen Sie eine vorhandene Klasse, entspricht der gewünschten json-Struktur. Objekt ist nicht so Klasse. Sie können immer noch bezeichnen Sie als
Object
, wenn nötig:Wenn Sie einen debugger verwenden, werden Sie sehen, dass der Typ das zurückgegebene Objekt ist
LinkedHashMap
. Also, was Sie sehen, ist die Ausgabe vonLinkedHashMap.toString()
. Es gibt keinen Weg für Jackson, um das zu ändern, so können Sie entweder wandeln Sie Sie in eine Karte und erstellen Sie die Zeichenfolge selbst oder Fragen Sie nach einem anderen return-Typ erzeugt, dass der JSON-String für Sie:Ausgabe:
System.out.println(mapper.writeValueAsString(myObject))
statt zu schreiben Ihre eigenen serializer.Als Jackson sagte zu binden, JSON, in Object.class es tut genau das; aber da es keine a-priori-wissen von dem, was vielleicht sein, dass JSON (oder welche Klassen man verwenden könnte), es hat die meisten grundlegenden Java-Typen: Karten, Listen, Zahlen, Boolesche Werte und Strings. So ist jedes JSON-Objekt wird repräsentiert durch die Karte; JSON-Array durch die Liste, und so weiter.
Wenn Sie möchten ein benutzerdefiniertes Objekt, müssen Sie Ihren Typ festlegen; oder, wenn serialisieren, ermöglichen die Aufnahme von expliziten Typinformationen ("polymorphe Art-handling"). Dies wird entweder Klasse name, oder geben Sie den Namen, und kann verwendet werden, um Deserialisieren wieder zu dem genauen Typ.
Um dies zu tun, geben Sie entweder sich selbst (oder einen seiner obertypen) muss mit @JsonTypeInfo annotation; oder, wenn es eine Objekt-Eigenschaft, @JsonTypeInfo der Eigenschaft (Feld oder Methode).