Laienhaft ausgedrückt handelt es sich bei Jackson um eine Java-Klassenbibliothek zur Verarbeitung von Daten im JSON-Format, deren Leistung sehr gut ist. In diesem Artikel wird eine detailliertere Beispielanalyse der Verwendung von Jackson gegeben. Die Einzelheiten lauten wie folgt:
1. Einführung
Jackson hat laut Tests eine relativ hohe Serialisierungs- und Deserialisierungseffizienz, unabhängig von der Konvertierungsform, Jackson > Gson > Json-lib, und die Verarbeitungsleistung von Jackson ist sogar fast zehnmal höher als die von Json-lib, und das ist auch richtig sehr hoch. Im Gegensatz dazu scheint Json-lib nicht mehr aktualisiert zu werden, und die neueste Version basiert ebenfalls auf JDK15, während die Jackson-Community aktiver ist.
Im Folgenden werden wir die Verwendung von Jackson anhand von Beispielen kurz vorstellen.
2. Verwendung
Jackson bietet viele Klassen und Methoden. Die am häufigsten verwendete Klasse bei der Serialisierung und Deserialisierung ist die ObjectMapper-Klasse, die JsonObject und ArrayObject in Json-lib ähnelt. Diese Klasse stellt Methoden wie readTree(), readValue(), writeValueAsString() zur Konvertierung bereit. Die spezifische Dokumentationsadresse für diese Klasse lautet: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html.
Um wiederholte Beschreibungen zu vermeiden, stammt der unten erwähnte ObjectMapper alle von ObjectMapper objectMapper = new ObjectMapper(). Im Folgenden wird die Verwendung im Hinblick auf Serialisierung und Deserialisierung kurz vorgestellt.
1. Serialisierung
① Serialisieren Sie Javas eigene Klassen
Testbeispiel
Liste list=new ArrayList();list.add(1);list.add(2);list.add(3);
Implementieren Sie die Serialisierung:
String teststringlist=objectMapper.writeValueAsString(list);System.out.println(teststringlist);
Die Ergebnisausgabe auf der Konsole lautet:
[1,2,3]
abschließend:
Jackson kann die Serialisierung allgemeiner Typen problemlos implementieren.
②Serialisierung benutzerdefinierter Klassen
Testbeispiel:
public class student {private int age=10;private String name="hhh"; public String[] list={"hao","haouhao","keyi"}; public int getAge () { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name } public void setName(String name) { this.name = name; }}
Um das Beispiel allgemeiner zu gestalten, enthält diese Klasse den Werttyp int, den Referenztyp String, String[] und den Datumstyp Date.
Implementieren Sie die Serialisierung
student st=new student();String teststringstu=objectMapper.writeValueAsString(st);System.out.println(teststringstu);
Die Ergebnisausgabe auf der Konsole lautet:
{"list":["hao", "haouhao", "keyi"],"time":1375429228382,"name": "hhh", "age":10}
abschließend:
Anhand der Ausgabe ist ersichtlich, dass der konvertierte JSON-String dem Format entspricht. Allerdings ist die Darstellung der Zeit etwas minderwertig. Änderungen am Zeitformat werden im Folgenden vorgestellt.
③Definition des Zeitformats
Jackson verfügt über ein eigenes Standardzeitformat in Form von Zeitstempeln, dessen Wirkung wie in den obigen Ergebnissen dargestellt ist (Beispiel: 1375429228382). Wenn Sie festlegen möchten, dass dieses Format ungültig ist, übergeben Sie es
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false)
Es kann so eingestellt werden, dass die Zeitgenerierung eine sogenannte [ISO-8601]-konforme Notation verwendet und eine Zeit ähnlich dem folgenden Format ausgibt: „1970-01-01T00:00:00.000+0000“.
Natürlich können Sie auch das Ausgabezeitformat anpassen.
Implementierung eines benutzerdefinierten Zeitformats
Das Beispiel verwendet auch die oben eingeführte Studentenklasse.
student st=new student();java.text.DateFormat myFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");objectMapper.getSerializationConfig().setDateFormat(myFormat);String teststringstu= objectMapper.writeValueAsString(st);System.out.println(teststringstu);
Die fehlerhafte Ausgabe auf der Konsole lautet:
{"list":["hao", "haouhao", "keyi"],"time": "2013-08-02 03:48:20", "name": "hhh", "age": 10}
abschließend:
Es ist ersichtlich, dass das Zeitausgabeformat zu dem geworden ist, was wir wollen. Die Methode zum Definieren des Zeitausgabeformats in Jackson ist viel einfacher als die Definition des Zeitformats in Json-lib.
④ Eine weitere Serialisierungsmethode
Implementieren Sie die Serialisierung
Als Beispiel wird immer noch die vorherige Schülerklasse verwendet.
student st=new student();JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);jsonGenerator.writeObject(st); System.out.println();
Die Ausgabe auf der Konsole ist:
{"list":["hao", "haouhao", "keyi"],"time":1375429228382,"name": "hhh", "age":10}
abschließend:
Diese Methode kann auch den Wert der oben genannten Methode abrufen. Achten Sie jedoch auf diese Funktion in dieser Methode: createJsonGenerator (), für die zwei Parameter erforderlich sind, einer ist der Parameter vom Typ OutputStream und der andere der Parameter vom Typ JsonEncoding. Anhand dieser beiden Parameter können wir verstehen, dass diese Methode Json nicht nur direkt in den Netzwerk-Stream schreiben kann, sondern auch Json in den Datei-Stream oder Speicher-Stream schreiben kann. Es ist also vielseitiger.
2. Deserialisierung
①Einmalige Deserialisierung
Diese Methode verwendet hauptsächlich die von ObjectMapper bereitgestellte Methode <testJsonClass> readValue(String content, Class<testJsonClass> valueType). Diese Methode erfordert die Eingabe einer JSON-Zeichenfolge und der entsprechenden Klasse der Klasse, die gefüllt werden muss, und gibt die gefüllte Klasse zurück.
Json-String in benutzerdefinierte Klasse analysieren
Wenn die Json-Zeichenfolge lautet:
String test1="{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]}"
Zeit.
Definieren Sie zunächst eine Klasse:
öffentliche Klasse testJsonClass { public int objectID; public List geoPoints=new ArrayList();}
Verwenden Sie dann den folgenden Codeausschnitt, um Json in diese Klasse zu deserialisieren:
testJsonClass testClass= objectMapper.readValue(test1, testJsonClass.class);
verwenden
System.out.println(testClass.objectID);System.out.println(testClass.geoPoints)
Die Werte, die Sie auf der Konsole ausgeben können, sind:
357[{x=504604.59802246094, y=305569.9150390625}]
Deserialisieren Sie die Json-Zeichenfolge in die systemeigene Klasse
Zeichenfolge json = „{“error“:0,“data“:{“name“: „ABC“, „age“:20, „phone“: {“home“: „abc“, „mobile“: „def“},“ Freunde":[{"Name": "DEF", "Telefon" :{"home":"hij", "mobile": "klm"}}, {"name": "GHI", "phone": {"home": "nop", "mobile": "qrs"} }]},"other":{"Spitzname":[]}}".
Definieren Sie eine Variable mithilfe der systemeigenen Map: Map<String, Map<String, Object>>-Maps. Verwenden Sie dann „maps = objectMapper.readValue(json, Map.class)“, um Json in die Variablenkarten zu deserialisieren.
passieren
System.out.println(maps.get("error"));System.out.println((Object)(maps.get("data").get("phone")))
In der Konsole können Sie folgende Ergebnisse erhalten:
0{home=abc, mobile=def}
②Schrittweise Deserialisierung
Diese Methode ist flexibler und kann nur den JSON-String-Informationswert extrahieren, an dem der Benutzer interessiert ist. Die Implementierung erfolgt hauptsächlich mithilfe des von ObjectMapper bereitgestellten readTree und der von Jackson bereitgestellten JsonNode-Klasse.
Testbeispiel
Zeichenfolge test="{"results":[{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.915039 0625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";
Dieser JSON-String ist relativ komplex, einschließlich der Form verschachtelter Arrays, und universell.
Implementieren Sie die Deserialisierung
JsonNode node= objectMapper.readTree(test); //Lesen Sie den Json-String in einer Baumstruktur in den Speicher ein. JsonNode content=node.get("results");//Holen Sie sich die Informationen unter dem Ergebnisknoten for(int i=0 ; i<contents.size();i++) // Durchlaufen Sie die Informationen unter den Ergebnissen. Die Funktion size () kann die Anzahl der im Knoten enthaltenen Informationen abrufen, ähnlich der Länge des Arrays {System.out.println(contents.get(i).get("objectID" ). getIntValue()); //Lesen Sie den Wert eines untergeordneten Knotens unter dem Knoten JsonNode geoNumber=contents.get(i).get("geoPoints");for(int j=0;j<geoNumber.size();j++) //Durchlaufe die Informationen unter den untergeordneten Knoten {System.out.println(geoNumber.get(j).get("x").getDoubleValue()+" " +geoNumber.get(j).get("y").getDoubleValue());}}
Die Ausgabe auf der Konsole ist:
357504604.59802246094 305569.9150390625358504602.2680053711 305554.43603515625
abschließend:
Diese Methode ähnelt der DOM-Analyse bei der XML-Analyse. Der Vorteil besteht darin, dass die Struktur detailliert ist und die gewünschten Informationen leicht extrahiert werden können. Der Nachteil ist natürlich derselbe wie bei dieser Methode: Sie kostet Zeit und Platz.
3. Zusammenfassung
Jacksons Operationen auf Json sind im Wesentlichen wie oben gezeigt. Die Methode ist sehr benutzerfreundlich und sehr flexibel. Sie bietet einmalige Operationen und Operationen, mit denen Informationen bei Bedarf gelesen werden können. Und Jackson verfügt über eine ganze Reihe von Funktionen, mit denen die Serialisierung und Deserialisierung in verschiedenen Details gesteuert werden kann, z. B. die Anmerkungsfunktion, die Funktion zur verzögerten Injektion für den Ruhezustand und die Funktion zum Festlegen des Zeitformats. Da diese Funktionen derzeit nicht benötigt werden, sollten Sie sie sorgfältig studieren für später. Gleichzeitig unterstützt Jackson auch eine Reihe von Serialisierungs- und Deserialisierungsvorgängen für XML. Die Idee ähnelt in etwa der Analyse von Json.
In Bezug auf die aktuellen Mängel von Jackson haben einige Leute im Internet getestet, dass es mehr Speicher beansprucht als Json-lib. Es lohnt sich im Allgemeinen, Raum für Zeit zu nutzen.