XStream-Benutzerhandbuch: JSON

XStream-Benutzerhandbuch: JSON

1. Überblick

Dies ist der dritte Artikel in einer Reihe über XStream. Wenn Sie mehr über die grundlegende Verwendung inconverting Java objects to XML undvice versa erfahren möchten, lesen Sie bitte die vorherigen Artikel.

Über die XML-Funktionen hinaus kann XStream auch Java-Objekte in und aus JSON konvertieren. In diesem Tutorial lernen wir diese Funktionen kennen.

2. Voraussetzungen

Bevor Sie dieses Tutorial lesen, lesen Sie bitte den Link: / xstream-serialize-object-to-xml,, in dem wir die Grundlagen der Bibliothek erläutern.

3. Abhängigkeiten


    com.thoughtworks.xstream
    xstream
    1.4.5

4. JSON-Treiber

In den vorherigen Artikeln haben wir gelernt, wie Sie eine XStream-Instanz einrichten und einen XML-Treiber auswählen. Ebenso stehen zwei Treiber zum Konvertieren von Objekten in und von JSON zur Verfügung:JsonHierarchicalStreamDriver undJettisonMappedXmlDriver.

4.1. JsonHierarchicalStreamDriver

Diese Treiberklasse kann Objekte in JSON serialisieren, ist jedoch nicht in der Lage, Objekte zu deserialisieren. Es sind keine zusätzlichen Abhängigkeiten erforderlich, und seine Treiberklasse ist eigenständig.

4.2. JettisonMappedXmlDriver

Diese Treiberklasse kann JSON in und von Objekten konvertieren. Mit dieser Treiberklasse müssen wir eine zusätzliche Abhängigkeit fürjettison. hinzufügen


    org.codehaus.jettison
    jettison
    1.3.7

5. Serialisierung eines Objekts in JSON

Erstellen wir eineCustomer-Klasse:

public class Customer {

    private String firstName;
    private String lastName;
    private Date dob;
    private String age;
    private List contactDetailsList;

    // getters and setters
}

Beachten Sie, dass wir (möglicherweise unerwartet)age alsString erstellt haben. Wir werden diese Wahl später erklären.

5.1. Verwenden vonJsonHierarchicalStreamDriver

Wir werden einJsonHierarchicalStreamDriver übergeben, um eine XStream-Instanz zu erstellen.

xstream = new XStream(new JsonHierarchicalStreamDriver());
dataJson = xstream.toXML(customer);

Dies generiert den folgenden JSON:

{
  "com.example.pojo.Customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:22:18.186 UTC",
    "age": "30",
    "contactDetailsList": [
      {
        "mobile": "6673543265",
        "landline": "0124-2460311"
      },
      {
        "mobile": "4676543565",
        "landline": "0120-223312"
      }
    ]
  }
}

5.2. JettisonMappedXmlDriver Implementierung

Wir werden eineJettisonMappedXmlDriver-Klasse übergeben, um eine Instanz zu erstellen.

xstream = new XStream(new JettisonMappedXmlDriver());
dataJson = xstream.toXML(customer);

Dies generiert den folgenden JSON:

{
  "com.example.pojo.Customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:25:50.745 UTC",
    "age": 30,
    "contactDetailsList": [
      {
        "com.example.pojo.ContactDetails": [
          {
            "mobile": 6673543265,
            "landline": "0124-2460311"
          },
          {
            "mobile": 4676543565,
            "landline": "0120-223312"
          }
        ]
      }
    ]
  }
}

5.3. Analyse

Anhand der Ausgabe der beiden Treiber können wir deutlich erkennen, dass es einige geringfügige Unterschiede im generierten JSON gibt. Beispielsweise lässtJettisonMappedXmlDriver die doppelten Anführungszeichen für numerische Werte weg, obwohl der Datentypjava.lang.String ist: __

"mobile": 4676543565,
"age": 30,

JsonHierarchicalStreamDriver hingegen behält die doppelten Anführungszeichen bei. __

6. JSON zu einem Objekt deserialisieren

Nehmen wir den folgenden JSON, um ihn wieder in einCustomer-Objekt zu konvertieren:

{
  "customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:41:01.987 UTC",
    "age": 30,
    "contactDetailsList": [
      {
        "com.example.pojo.ContactDetails": [
          {
            "mobile": 6673543265,
            "landline": "0124-2460311"
          },
          {
            "mobile": 4676543565,
            "landline": "0120-223312"
          }
        ]
      }
    ]
  }
}

Denken Sie daran, dass nur einer der Treiber (JettisonMappedXMLDriver) JSON deserialisieren kann. Der Versuch,_ _JsonHierarchicalStreamDriver für diesen Zweck zu verwenden, führt zuUnsupportedOperationException.

Mit dem Jettison-Treiber können wir dasCustomer-Objekt deserialisieren:

customer = (Customer) xstream.fromXML(dataJson);

7. Fazit

In diesem Artikel haben wir die JSON-Verarbeitungsfunktionen von XStream zum Konvertieren von Objekten in und aus JSON behandelt. Wir haben auch untersucht, wie wir unsere JSON-Ausgabe optimieren können, um sie kürzer, einfacher und lesbarer zu machen.

Wie bei der XML-Verarbeitung von XStream gibt es andere Möglichkeiten, die Serialisierung von JSON durch Konfigurieren der Instanz mithilfe von Anmerkungen oder programmgesteuerter Konfiguration weiter anzupassen. Weitere Details und Beispiele finden Sie infirst article in this series.

Der vollständige Quellcode mit Beispielen kann vonlinked GitHub repository heruntergeladen werden.