[JAVA] Gérez JSON avec minimal-json

Aperçu

Décrit comment utiliser la bibliothèque Java JSON minimal-json.

Travailler avec JSON en Java

Jusqu'à présent (~ JDK 1.8) Java ne fournissait pas de bibliothèque JSON en standard, il était donc nécessaire d'utiliser une bibliothèque pour gérer efficacement JSON. Voici quelques-uns des célèbres 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

Vous pouvez découvrir comment utiliser chaque bibliothèque en recherchant Qiita ou Internet, donc je ne vais pas le couvrir dans cet article.

minimal-json? Comme son nom l'indique, il s'agit d'une petite bibliothèque Java axée sur la lecture et l'écriture de JSON. Publié sous Licence MIT. En regardant le README.md du dépôt, sortira de telle sorte que veulent dire: « Ce fut vraiment? » Graphique montrant la haute performance.

Le nombre de classes n'est pas très grand, et il semble qu'il n'y en ait que 15 ci-dessous dans la version 0.9.4. La taille du fichier du pot est de 29,7 Ko.

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

Statut de développement

Selon la version GitHub, la dernière version datait du 20/07/2015 et le dernier commit datait de six mois 2016. / 10/25. Il semble que le développement lui-même est toujours en cours.

Pourquoi minimal-json?

Si vous voulez juste lire et écrire du JSON simple, Gson et Jackson ont trop de fonctions, et org.json, qui n'a que des fonctions simples, a une licence JSON [^ json], donc il n'y avait pas de choix inattendu. .. Ce minimal-json ne peut être utilisé que pour analyser JSON, mais comme mentionné ci-dessus, il ne comprend que 15 classes et la licence MIT / LICENSE), cela peut donc être une alternative si vous souhaitez utiliser org.json.

Notez que cette bibliothèque n'a pas la capacité de mapper aux objets fournis par Gson et Jackson, donc si vous avez besoin d'une telle fonctionnalité, vous devez utiliser une bibliothèque différente de celle d'implémenter vous-même le code de mappage. Il vaut mieux l'utiliser.


introduction

Ajoutez simplement une ligne aux dépendances dans build.gradle. Au moment de la rédaction de l'article, la dernière version était la 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>

Autre que ce qui précède, veuillez voir ici.


utilisation

Générer une chaîne JSON

Vous pouvez créer un objet vide avec new et y ajouter la clé et la valeur avec la méthode add. Il peut s'agir d'une chaîne JSON avec la méthode toString ().

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

production


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

Création d'un objet JsonObject à partir d'une chaîne

Passez la chaîne JSON à Json # parse et récupérez l'objet JSON avec asObject ().

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

Extraire la valeur

Pour String / int / double / float / long / boolean, il existe une méthode get ~~ dédiée. Si le JSON que vous chargez est entièrement sous le contrôle du développeur de l'application et que le format est fixe, vous pouvez utiliser ces méthodes.

Spécifiez la clé sous forme de chaîne pour récupérer la valeur. Pour le deuxième argument, spécifiez la valeur par défaut en l'absence de clé.

json.getString("name", "")

Par exemple, supposons que vous ayez un JSON simple comme celui-ci:

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

Le code pour analyser cela, récupérer la valeur et l'afficher dans la sortie standard est le suivant.

java


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

Notez que age est un entier, donc si vous essayez de le récupérer sous forme de chaîne, vous obtiendrez java.lang.UnsupportedOperationException```.

Code avec exception


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

Exceptions et messages


java.lang.UnsupportedOperationException: Not a string: 28

Si vous souhaitez récupérer la valeur de int en tant que String, vous pouvez utiliser toString () sur l'objet JsonValue récupéré par get (key).

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

Cependant, notez que json.get ("age") peut retourner null dans ce cas.

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

Si vous pouvez utiliser Facultatif, vous devez l'utiliser ensemble.

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

support nul

Par exemple, supposons que vous ayez un JSON simple comme celui-ci:

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

Lorsque j'essaye de getString "nullable", j'obtiens l'erreur suivante: J'aimerais que la valeur defaultValue soit utile ...

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)

À propos, l'exception peut être évitée avec ce qui suit, mais elle est affichée comme nulle dans la sortie standard.

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

J'ai pensé que "facultatif était une telle spécification" et j'ai exécuté le code suivant pour le résoudre. Ce null n'est pas un null Java mais un littéral JSON null (com.eclipsesource.json.JsonLiteral Il semble qu'il ait été interprété comme /main/java/com/eclipsesource/json/JsonLiteral.java)).

Code d'enquête


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

production


com.eclipsesource.json.JsonLiteral

Eh bien, je pense que vous l'avez remarqué peu de temps après l'avoir regardé jusqu'à présent. Lorsqu'il s'agit de valeurs extraites de JSON dans cette bibliothèque, il est plus sûr de les récupérer avec get et d'y accéder via un objet JsonValue, et la vérification des valeurs nulles est plus facile. Cela fonctionne mieux lorsqu'il est combiné avec facultatif.


Malheureusement

JsonArray n'est pas compatible avec Java 8

La classe JsonArray implémente Iterable est. Puisqu'il n'y a pas de stream (), l'API Stream ne peut pas être utilisée, et seul forEach est fourni en tant que méthode pouvant être utilisée pour l'itération. Je veux au moins un filtre / une carte.

Il n'y a pas de méthode a

La raison pour laquelle j'ai sorti Optional est qu'il n'y a pas de méthode pour vérifier l'existence de la clé. Eh bien, dans cet esprit, je pense que c'est un peu difficile d'utiliser cette bibliothèque en dessous de 1.7 ... C'est un code avec beaucoup de vérifications nulles si.


Résumé

Nous avons décrit les fonctionnalités et la méthode d'introduction de la bibliothèque Java minimal-json, qui vous permet d'utiliser JSON très facilement. Il est plus sûr d'utiliser get (key) pour récupérer la valeur, et il est préférable de l'utiliser en combinaison avec Optional.

[^ json]: La bibliothèque sous licence JSON est autorisée à être utilisée par les entreprises qui ont adopté une politique de gestion des licences logicielles conservatrice avec l'interprétation de `` Le logiciel doit être utilisé pour le bien, pas le mal ''. Il y a des cas où cela ne peut pas être fait. Il semble y avoir une vue selon laquelle "la licence JSON n'est pas appliquée au code de org.json", mais on peut juger qu'il n'y a pas besoin de prendre des risques inutiles tant qu'il existe une alternative dans la bibliothèque JSON de Java. Je pense qu'il a un haut degré de sexualité. Au fait, le SDK Android inclut la bibliothèque de org.json, mais il y a un problème surtout en termes de licence. Je n'ai pas entendu qu'il y en a.

Recommended Posts

Gérez JSON avec minimal-json
Gérez JSON sans effort avec le respone Json d'Alamofire
Différé avec JSON
Importer JSON avec SolrJ
Gérez les fichiers avec NIO.2.
Validation de JSON avec le schéma JSON
Manipuler le dispositif avec des rails
Formater JSON avec org.json
Gérez le cross-domain JSON avec Play Framework
[Java] Communication JSON avec jackson
Gérer les dates avec Javascript (moment.js)
[Ruby] Gérez les variables d'instance avec des méthodes d'instance
Gérer DatePicker avec Ruby / gtk3 + glade3
[Java] Obtenir et gérer Json à partir d'une URL avec une API standard (javax.script)
Appliquer le processus de correspondance d'expressions régulières avec JSON Sassert
[Java] Gérer les fichiers Excel avec Apache POI
Comment gérer les erreurs de connexion avec l'appareil
Gérez d'énormes JSON avec Java Lambda
Conversion de JSON en TSV et TSV en JSON avec Ruby