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.
Ab dem 12. August 2017, als dieser Artikel geschrieben wurde, ist die neueste Version 1.5.0 (2017/05) / 15).
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.
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.
In 1.5.0 war es Apache 2.0 wie andere Ok-Serien.
Sie können es nur durch Hinzufügen einer Zeile verwenden.
app/build.gradle
dependencies {
compile 'com.squareup.moshi:moshi:1.5.0'
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 *
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).
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;
}
}
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"));
Moshi verwendet eine Klasse namens JsonAdapter, um die Konvertierung durchzuführen.
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);
Führen Sie mit JsonAdapter.toJson aus.
final String json = tabJsonAdapter.toJson(tab);
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
Es kann etwas verwirrend sein, wenn mehr Klassen verwendet werden, toJson keine Werte mehr direkt zurückgibt und toJson jetzt Ausnahmen auslöst.
Wie unten gezeigt, wurde JSON mit dem angegebenen Einzug ausgegeben.
{
"histories": [
{
"title": "Title",
"url": "URL"
}
],
"index": 0,
"lastTitle": "Google",
"thumbnailPath": "file://~~"
}
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.
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();
}
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.
Der Code für diese Operationsüberprüfung wird in gist eingegeben. https://gist.github.com/toastkidjp/252bc2ac86de2c0a3625b9fed0b9fc62
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.
Recommended Posts