[JAVA] Behandeln Sie JSON mit minimal-json

Überblick

Beschreibt die Verwendung der Java JSON-Bibliothek minimal-json.

Arbeiten mit JSON in Java

Bis jetzt (~ JDK 1.8) stellte Java standardmäßig keine JSON-Bibliothek zur Verfügung, daher war es erforderlich, eine Bibliothek zu verwenden, um JSON effizient zu handhaben. Das Folgende sind einige der berühmten OSS.

Library License Link
org.json JSON MVNRepository.com
Jackson Apache License 2.0 GitHub/MVNRepository.com
JSONIC Apache License 2.0 Official site/MVNRepository.com
Gson Apache License 2.0 GitHub/MVNRepository.com
JsonPath Apache License 2.0 GitHub/MVNRepository.com

Sie können herausfinden, wie jede Bibliothek verwendet wird, indem Sie in Qiita oder im Internet suchen. Daher werde ich in diesem Artikel nicht darauf eingehen.

minimal-json? Wie der Name schon sagt, handelt es sich um eine kleine Java-Bibliothek, die sich auf das Lesen und Schreiben von JSON konzentriert. Veröffentlicht unter MIT-Lizenz. Mit Blick auf die README.md des Endlagers, kommt heraus, so dass sagen wollen: „Das ist wirklich das war?“ Graph zeigt die hohe Leistung.

Die Anzahl der Klassen ist nicht sehr groß, und es scheint, dass es in Version 0.9.4 nur 15 unten gibt. Die Dateigröße der JAR beträgt 29,7 KB.

https://github.com/ralfstx/minimal-json/tree/master/com.eclipsesource.json/src/main/java/com/eclipsesource/json

  1. Json.java
  2. JsonArray.java
  3. JsonHandler.java
  4. JsonLiteral.java
  5. JsonNumber.java
  6. JsonObject.java
  7. JsonParser.java
  8. JsonString.java
  9. JsonValue.java
  10. JsonWriter.java
  11. Location.java
  12. ParseException.java
  13. PrettyPrint.java
  14. WriterConfig.java
  15. WritingBuffer.java

Entwicklungsstatus

Laut der GitHub-Version war die letzte Version der 20.07.2015 und der letzte Commit war vor sechs Monaten 2016. / 10/25. Es scheint, dass die Entwicklung selbst noch andauert.

Warum Minimal-Json?

Wenn Sie nur einfaches JSON lesen und schreiben möchten, haben Gson und Jackson zu viele Funktionen, und org.json, das nur einfache Funktionen hat, verfügt über eine JSON-Lizenz [^ json], sodass unerwartet keine Auswahl getroffen wurde. .. Dieser Minimal-JSON kann nur zum Parsen von JSON verwendet werden. Wie oben erwähnt, besteht er jedoch nur aus 15 Klassen und der MIT-Lizenz. / LICENSE), daher kann es eine Alternative sein, wenn Sie org.json verwenden möchten.

Beachten Sie, dass diese Bibliothek nicht in der Lage ist, Objekten zuzuordnen, wie sie von Gson und Jackson bereitgestellt werden. Wenn Sie also eine solche Funktion benötigen, sollten Sie eine andere Bibliothek verwenden, als den Zuordnungscode selbst zu implementieren. Es ist besser, es zu benutzen.


Einführung

Fügen Sie einfach eine Zeile zu den Abhängigkeiten in build.gradle hinzu. Zum Zeitpunkt des Schreibens des Artikels war die neueste Version 0.9.4.

Gradle

build.gradle


dependencies {
    compile 'com.eclipsesource.minimal-json:minimal-json:0.9.4'

Maven

pom.xml


<dependency>
    <groupId>com.eclipsesource.minimal-json</groupId>
    <artifactId>minimal-json</artifactId>
    <version>0.9.4</version>
</dependency>

Andere als die oben genannten finden Sie unter hier.


verwenden

Generieren Sie eine JSON-Zeichenfolge

Sie können ein leeres Objekt mit new erstellen und den Schlüssel und den Wert mit der Methode add hinzufügen. Es kann sich um eine JSON-Zeichenfolge mit der Methode toString () handeln.

final JsonObject json = new JsonObject();
json.add("name", "Bill");
json.add("age", 24);
System.out.println(json.toString());

Ausgabe


{"name":"Bill","age":24}

Erstellen eines JsonObject-Objekts aus einer Zeichenfolge

Übergeben Sie die JSON-Zeichenfolge an Json # parse und rufen Sie das JSON-Objekt mit asObject () ab.

final JsonObject json = Json.parse(jsonStr).asObject();

Wert extrahieren

Für String / int / double / float / long / boolean gibt es eine dedizierte get ~~ -Methode. Wenn der von Ihnen geladene JSON vollständig vom Anwendungsentwickler gesteuert wird und das Format festgelegt ist, können Sie diese Methoden verwenden.

Geben Sie den Schlüssel als Zeichenfolge an, um den Wert abzurufen. Geben Sie im zweiten Argument den Standardwert an, wenn kein Schlüssel vorhanden ist.

json.getString("name", "")

Angenommen, Sie haben einen einfachen JSON wie diesen:

{"name": "John", "age": 28}

Der Code zum Analysieren, Abrufen und Anzeigen des Werts in der Standardausgabe lautet wie folgt.

java


final JsonObject json = Json.parse("{\"name\": \"John\", \"age\": 28}").asObject();
System.out.println(json.getString("name", "-"));
System.out.println(json.getInt("age", -1));

Beachten Sie, dass `` age``` int ist. Wenn Sie also versuchen, es als String abzurufen, erhalten Sie `java.lang.UnsupportedOperationException```.

Code mit Ausnahme


System.out.println(json.getString("age", "-"));

Ausnahmen und Meldungen


java.lang.UnsupportedOperationException: Not a string: 28

Wenn Sie den Wert von int als String abrufen möchten, können Sie mit toString () das JsonValue-Objekt mit get (key) abrufen.

System.out.println(json.get("age").toString());

Beachten Sie jedoch, dass json.get ("age") in diesem Fall null zurückgeben kann.

final JsonValue nullable = json.get("age");
if (nullable != null) {
    System.out.println(nullable.toString());
}

Wenn Sie Optional verwenden können, sollten Sie es zusammen verwenden.

Optional.ofNullable(json.get("age"))
        .map(JsonValue::toString)
        .ifPresent(System.out::println);

Null-Unterstützung

Angenommen, Sie haben einen einfachen JSON wie diesen:

{"name": "John", "age": 28, "nullable": null}

Wenn ich versuche, getString "nullable" zu erhalten, wird der folgende Fehler angezeigt: Ich möchte, dass der defaultValue nützlich ist ...

java.lang.UnsupportedOperationException: Not a string: null
	at com.eclipsesource.json.JsonValue.asString(JsonValue.java:389)
	at com.eclipsesource.json.JsonObject.getString(JsonObject.java:674)
	at jp.toastkid.libs.epub.EpubMetaData.readJson(EpubMetaData.java:114)

Übrigens kann die Ausnahme wie folgt vermieden werden, sie wird jedoch in der Standardausgabe als Null angezeigt.

Optional.ofNullable(json.get("nullable"))
        .map(JsonValue::toString)
        .ifPresent(System.out::println);

Ich dachte "Optional war eine solche Spezifikation" und führte den folgenden Code aus, um sie zu lösen. Diese Null ist keine Java-Null, sondern eine JSON-Literal-Null (com.eclipsesource.json.JsonLiteral. Es scheint, dass es als /main/java/com/eclipsesource/json/JsonLiteral.java)) interpretiert wurde.

Umfragecode


Optional.ofNullable(json.get("nullable"))
        .map(Object::getClass)
        .map(Class::getName)
        .ifPresent(System.out::println);

Ausgabe


com.eclipsesource.json.JsonLiteral

Nun, ich denke, Sie haben es bemerkt, indem Sie es sich bisher angesehen haben. Wenn Sie mit Werten arbeiten, die in dieser Bibliothek aus JSON abgerufen wurden, ist es sicherer, sie mit get abzurufen und über das JsonValue-Objekt darauf zuzugreifen, und die Nullprüfung ist einfacher. In Kombination mit Optional funktioniert es besser.


Unglücklicherweise

JsonArray ist nicht mit Java 8 kompatibel

JsonArray-Klasse implementiert Iterable ist. Da kein stream () vorhanden ist, kann die Stream-API nicht verwendet werden, und nur forEach wird als Methode bereitgestellt, die für die Iteration verwendet werden kann. Ich möchte mindestens Filter / Map.

Es gibt keine Has-Methode

Der Grund, warum ich Optional herausgebracht habe, ist, dass es keine Methode gibt, um die Existenz des Schlüssels zu überprüfen. Vor diesem Hintergrund denke ich, dass es ein bisschen schwierig ist, diese Bibliothek unter 1.7 zu verwenden ... Es ist Code mit vielen Null-Checks in if.


Zusammenfassung

Wir haben die Funktionen und die Einführungsmethode der Java-Bibliothek minimal-json beschrieben, mit der Sie sehr einfaches JSON bedienen können. Es ist sicherer, get (key) zu verwenden, um den Wert abzurufen, und es fühlt sich besser an, ihn in Kombination mit Optional zu verwenden.

[^ json]: Die JSON-lizenzierte Bibliothek darf von Unternehmen verwendet werden, die eine konservative Richtlinie zur Verwaltung von Softwarelizenzen mit der Interpretation "Die Software wird zum Guten und nicht zum Bösen verwendet" eingeführt haben Es gibt Fälle, in denen dies nicht möglich ist. Es scheint die Ansicht zu bestehen, dass "JSON-Lizenz nicht auf den Code von org.json angewendet wird", aber es kann beurteilt werden, dass kein unnötiges Risiko eingegangen werden muss, solange es eine Alternative in der JSON-Bibliothek von Java gibt. Ich denke, es hat ein hohes Maß an Sexualität. Das Android SDK enthält übrigens org.jsons Bibliothek, aber es gibt ein bestimmtes Lizenzproblem. Ich habe nicht gehört, dass es gibt.

Recommended Posts

Behandeln Sie JSON mit minimal-json
Behandeln Sie JSON mühelos mit Alamofires Antwort Json
Anders als bei JSON
Importieren Sie JSON mit SolrJ
Behandeln Sie Dateien mit NIO.2.
Validierung von JSON mit JSON-Schema
Gerät mit Schienen handhaben
Formatieren Sie JSON mit org.json
Behandeln Sie JSON domänenübergreifend mit Play Framework
[Java] JSON-Kommunikation mit Jackson
Behandle Daten mit Javascript (moment.js)
[Ruby] Behandeln Sie Instanzvariablen mit Instanzmethoden
Behandle DatePicker mit Ruby / gtk3 + glade3
[Java] Json von der URL mit der Standard-API (javax.script) abrufen und verarbeiten
Wenden Sie den Matching-Prozess für reguläre Ausdrücke mit JSON Sassert an
[Java] Behandeln Sie Excel-Dateien mit Apache POI
So behandeln Sie Anmeldefehler mit devise
Behandeln Sie große JSON mit Java Lambda
Konvertieren Sie mit Ruby von JSON nach TSV und von TSV nach JSON