Konvertieren Sie mit Moshi zwischen Java-Objekten und JSON

Überblick

Verwenden Sie das Standard-Android-SDK org.json, ganz zu schweigen von Jackson, um den Prozess des Konvertierens eines Java-Objekts in JSON und des Speicherns in eine Datei oder des Konvertierens des gespeicherten JSON in ein Java-Objekt zu implementieren. Ich war ein bisschen hart und als ich nach einer guten Bibliothek suchte, fand ich Moshi von Square, Inc.. Ich habe herausgefunden, dass es eine Bibliothek namens /) gibt, also habe ich es einfach versucht.


Moshi Moshi ist eine von Square Inc. entwickelte JSON-Bibliothek. Es scheint, dass es als eine der Ok-Serien auf der Droidcon Montreal 2015 vorgestellt wurde.

A Few 'Ok' Libraries (Droidcon MTL 2015)

Ich werde diesmal nicht darauf eingehen, aber in der Ok-Reihe gibt es andere HTTP-Clients OkHttp und E / A-Bibliotheken Okio. / square / ooki /) etc. wurden veröffentlicht.

Ausführung

Ab dem 12. August 2017, als dieser Artikel geschrieben wurde, ist die neueste Version 1.5.0 (2017/05) / 15).

Dateigröße

Die Dateigröße beträgt nur 64 KB. Dies kann bei der Entwicklung von Android-Apps von Vorteil sein. Wenn man bedenkt, dass Jackson nahe bei 1 MB und Gson bei 144 KB liegt, ist die neueste Version 2.8.1 recht klein.

Gemäß der 1.4.0 API-Dokumentation sind die im Text enthaltenen Klassen wie folgt.

  1. FromJson
  2. Json
  3. JsonAdapter
  4. JsonAdapter.Factory
  5. JsonDataException
  6. JsonEncodingException
  7. JsonQualifier
  8. JsonReader
  9. JsonReader.Options
  10. JsonReader.Token
  11. JsonWriter
  12. Moshi
  13. Moshi.Builder
  14. ToJson
  15. Types

Abhängigkeit

Wenn Sie sich den Quellcode von GitHub Repository kurz ansehen, findet test android.util.Pair. Ich verwende nur die Referenz / android / util / Pair.html) und es scheint, dass die Implementierung der Bibliothek keine Android SDK-Abhängigkeiten enthält. Daher kann es wie andere Ok-Serien auch für andere als Android-Apps verwendet werden.

Beachten Sie, dass Okio in der Abhängigkeit enthalten ist. Dies ist auch eine E / A-Bibliothek, die nicht vom Android SDK abhängt.

Lizenz

In 1.5.0 war es Apache 2.0 wie andere Ok-Serien.


Einführung

Hinzufügen von Abhängigkeit

Sie können es nur durch Hinzufügen einer Zeile verwenden.

app/build.gradle


dependencies {
  compile 'com.squareup.moshi:moshi:1.5.0'

Proguard-Einstellungen für Android-Apps

Laut README of GitHub Repository sind bei Verwendung von Proguard die folgenden Einstellungen erforderlich. Diese Einstellung ist für die Verwendung in Java-Anwendungen nicht erforderlich.

-dontwarn okio.**
-dontwarn javax.annotation.Nullable
-dontwarn javax.annotation.ParametersAreNonnullByDefault
-keepclasseswithmembers class * {
    @com.squareup.moshi.* <methods>;
}
-keep @com.squareup.moshi.JsonQualifier interface *

Annahme

Ausführungsumgebung

Artikel Wert
IDE Android Studio 2.3 & IntelliJ IDEA
Java 1.8.0_131
OS Windows 10

Im Folgenden wird die Erläuterung der für diese Vorgangsüberprüfung erforderlichen Beispielklasse fortgesetzt. [Klicken Sie hier, wenn Sie sie nicht benötigen](# java-% E3% 82% AA% E3% 83% 96% E3 % 82% B8% E3% 82% A7% E3% 82% AF% E3% 83% 88% E3% 81% A8-json-% E3% 82% 92% E7% 9B% B8% E4% BA% 92% E5% A4% 89% E6% 8F% 9B% E3% 81% 99% E3% 82% 8B).

Klasse, um diese Zeit zu nutzen

Lassen Sie uns mit einer Klasse arbeiten, die Registerkarten in einem Webbrowser definiert.

Tab.java


import java.util.ArrayList;
import java.util.List;

class Tab {

    private List<History> histories;

    private int index;

    private String thumbnailPath;

    private String lastTitle;

    Tab() {
        histories = new ArrayList<>();
        index = -1;
    }

    // Simple accessor methods...

    void addHistory(final History history) {
        histories.add(history);
        index++;
    }

    History getLatest() {
        return histories.get(index);
    }
}

Die in der Tab-Klasse verwendete History-Klasse ist eine einfache Klasse, die nur zwei Felder vom Typ String enthält, wie unten gezeigt.

History.java


class History {

    private final String title;

    private final String url;

    private History(final String title, final String url) {
        this.title = title;
        this.url   = url;
    }

    public static History make(final String title, final String url) {
        return new History(title, url);
    }

    public String title() {
        return title;
    }

    public String url() {
        return url;
    }

}

Vorbereitung

Initialisieren Sie das Tab-Objekt vor den folgenden Schritten.

final Tab tab = new Tab();
tab.setThumbnailPath("file://~~");
tab.setLastTitle("Google");
tab.addHistory(History.make("Title", "URL"));

Konvertieren Sie zwischen Java-Objekten und JSON

Moshi verwendet eine Klasse namens JsonAdapter, um die Konvertierung durchzuführen.

Holen Sie sich JsonAdapter

Erstellen Sie ein Moshi-Objekt und verwenden Sie die Adaptermethode, um den zu konvertierenden Typ anzugeben und das JsonAdapter-Objekt abzurufen.

final Moshi moshi = new Moshi.Builder().build();
final JsonAdapter<Tab> tabJsonAdapter = moshi.adapter(Tab.class);

Java-Objekt-> JSON-Konvertierung

Führen Sie mit JsonAdapter.toJson aus.

final String json = tabJsonAdapter.toJson(tab);

Ausgabe

Der folgende JSON wird ausgegeben.

{"histories":[{"title":"Title","url":"URL"}],"index":0,"lastTitle":"Google","thumbnailPath":"file://~~"}

Pretty Printing Wenn Sie den JSON in einem formatierten Zustand ausgeben möchten, dauert es einige Zeit.

pretty_print


final Buffer buffer = new Buffer(); // 1.
final JsonWriter prettyPrintWriter = JsonWriter.of(buffer); // 2.
prettyPrintWriter.setIndent("  "); // 3.
try {
    tabJsonAdapter.toJson(prettyPrintWriter, tab); // 4.
} catch (final IOException e) {
    e.printStackTrace();
}

final String json = buffer.readUtf8(); // 5

Verfahren

  1. Bereiten Sie ein Pufferobjekt für [Okio] vor (https://github.com/square/okio/).
  2. Rufen Sie das JsonWriter-Objekt für das Buffer-Objekt in 1 ab.
  3. Setzen Sie einen Einzug auf 2 JsonWriter
  4. Übergeben Sie das JsonWriter- und Java-Objekt an JsonAdapter.toJson und führen Sie es aus Da das Buffer-Objekt von 5.1 geschrieben wird, lesen Sie, um die Zeichenfolge zu extrahieren.

Es kann etwas verwirrend sein, wenn mehr Klassen verwendet werden, toJson keine Werte mehr direkt zurückgibt und toJson jetzt Ausnahmen auslöst.

Ausgabeergebnis

Wie unten gezeigt, wurde JSON mit dem angegebenen Einzug ausgegeben.

{
  "histories": [
    {
      "title": "Title",
      "url": "URL"
    }
  ],
  "index": 0,
  "lastTitle": "Google",
  "thumbnailPath": "file://~~"
}

Bemerkungen

Obwohl dies überhaupt nicht praktikabel ist, scheint es, dass die in Schritt 3 als Einzug übergebene Zeichenfolge keine Rolle spielt. Wenn beispielsweise * 2 als Einzug angegeben wird, wird der folgende JSON ausgegeben.

{
**"histories": [
****{
******"title": "Title",
******"url": "URL"
****}
**],
**"index": 0,
**"lastTitle": "Google",
**"thumbnailPath": "file://~~"
}

Wenn Sie diesen JSON an JsonAdapter.fromJson übergeben, der später beschrieben wird, erhalten Sie natürlich eine Ausnahme, da er nicht als JSON analysiert werden kann.

JSON-> Java-Objektkonvertierung

Führen Sie mit JsonAdapter.fromJson aus. Diese Methode kann eine IOException auslösen und muss erledigt werden.

try {
    final Tab fromJson = tabJsonAdapter.fromJson(json);
} catch (IOException e) {
    e.printStackTrace();
}

Ausgabe

Lassen Sie uns den Inhalt des erhaltenen Tab-Objekts mit Standardausgabe anzeigen.

System.out.println(fromJson.getLastTitle());
System.out.println(fromJson.getThumbnailPath());
System.out.println(fromJson.getLatest().title());
System.out.println(fromJson.getLatest().url());
Google
file://~~
Title
URL

Es scheint, dass die von mir definierte Geschichtsklasse auch richtig konvertiert wird. Ich finde es gut, auch eine Klasse konvertieren zu können, die keinen öffentlichen Konstruktor hat.

Quellcode

Der Code für diese Operationsüberprüfung wird in gist eingegeben. https://gist.github.com/toastkidjp/252bc2ac86de2c0a3625b9fed0b9fc62


Zusammenfassung

Moshi ist eine leichte und benutzerfreundliche JSON-Bibliothek. Da die Bibliothek selbst keine Android SDK-Abhängigkeit enthält, kann sie nicht nur für Android, sondern auch für die normale Entwicklung von Java-Anwendungen verwendet werden. Ich habe eine einfache Methode der gegenseitigen Umwandlung mit diesem Moshi beschrieben.

Referenz

Recommended Posts

Konvertieren Sie mit Moshi zwischen Java-Objekten und JSON
Gegenseitige Umwandlung zwischen Funktion und Verbraucher
Moshi ~ Json Konvertierungsbibliothek ~
Konvertieren Sie JSON und YAML in Java (mit Jackson und SnakeYAML)
[Java] Unterschied zwischen == und gleich
Unterschiede zwischen "Anfänger" Java und Kotlin
[JAVA] Unterschied zwischen Abstract und Interface
[Java] Beziehung zwischen H2DB und JDBC
[Java] Unterschied zwischen Array und ArrayList
[Android] Konvertieren Sie Map in JSON mit GSON mit Kotlin und Java
Unterschiede zwischen Java und .NET Framework
[Java] Unterschied zwischen Closeable und AutoCloseable
[Java] Unterschied zwischen StringBuffer und StringBuilder
Java-Array / Liste / Stream gegenseitige Konvertierungsliste
[Java] Unterschied zwischen Länge, Länge () und Größe ()
[Java] Gegenseitige Konvertierung von Notationen wie Kamel- und Schlangenfällen [Jackson]
Konvertieren Sie Java org.w3c.dom.Document-Objekte und XML-Zeichenfolgen
Beziehung zwischen Kotlin- und Java-Zugriffsmodifikatoren
Unterschied zwischen final und Immutable in Java
Java-Studie Nr. 3 (Typkonvertierung und Befehlsausführung)
[Für Anfänger] Unterschied zwischen Java und Kotlin
Versuchen Sie es mit der JSON-Format-API in Java
[Java] Unterschiede zwischen Instanzvariablen und Klassenvariablen
Zusammenarbeit zwischen Java und Derby mit JDBC (mit NetBeans)
[Java] Unterschied zwischen Intstream-Bereich und rangeClosed
[Java] Berechnungsmechanismus, Operatoren und Typkonvertierung
Unterschied zwischen int und Integer in Java
HashMap # putAll () verhält sich zwischen Java 7 und Java 8 unterschiedlich
Hex und UIColor wechselseitige Konvertierung mit Swift
Zusammenfassung der gegenseitigen Konvertierung zwischen Groovys Standard-Groovy-Methoden und Javas Stream-API
[Java] Verstehe den Unterschied zwischen List und Set
Erstellen Sie eine API mit Retrofit2, Okhttp3 und Gson (Java).
Installieren Sie Java und Android-SDK auf dem Mac mit Homebrew
Unterschied zwischen next () und nextLine () in Java Scanner
JSON mit Java und Jackson Teil 2 XSS-Maßnahmen
Fassen Sie die Unterschiede zwischen C # - und Java-Schrift zusammen
Unterscheiden Sie in Java zwischen positiven und negativen Zahlen
[Java] Unterschied zwischen "endgültiger Variable" und "unveränderlichem Objekt"