Introduction à JSON-Java (org.json)

Introduction à JSON-Java (org.json)

1. Introduction à JSON-Java

JSON (acronyme de JavaScript Object Notation) est un format d'échange de données léger et estmost commonly used for client-server communication. Il est à la fois facile à lire / écrire et indépendant du langage. Une valeur JSON peut être un autre JSONobject, array, number, string, boolean (vrai / faux) ounull.

Dans ce didacticiel, nous verrons comment créer, manipuler et analyser JSON à l'aide de l'une des bibliothèques de traitement JSON disponibles, c'est-à-dire que la bibliothèqueJSON-Java est également connue sous le nom deorg.json.

Lectures complémentaires:

Itération sur une instance de org.json.JSONObject

Apprenez à parcourir et à parcourir un objet JSON

Read more

Escape JSON String en Java

Apprenez à échapper à un noyau Java ou à une bibliothèque JSON String

Read more

2. Prérequis

Avant de commencer, nous devrons ajouter la dépendance suivante dans nospom.xml:


    org.json
    json
    20180130

La dernière version peut être trouvée dans leMaven Central repository.

Notez que ce package a déjà été inclus dans le SDK Android, nous ne devons donc pas l'inclure lorsque vous l'utilisez.

3. JSON en Java [package org.json]

La bibliothèqueJSON-Java est également connue sous le nom deorg.json (à ne pas confondre avec lesorg.json.simple de Google) nous fournit des classes qui sont utilisées pour analyser et manipuler JSON en Java.

En outre, cette bibliothèque peut également convertir entre JSON, XML, en-têtes HTTP, Cookies, Liste ou texte délimités par des virgules, etc.

Dans ce didacticiel, nous allons examiner:

  1. JSONObject - similaire à l'objet de typeMap natif de Java qui stocke des paires clé-valeur non ordonnées

  2. JSONArray - une séquence ordonnée de valeurs similaire à l'implémentation native Vector de Java

  3. JSONTokener - un outil qui divise un morceau de texte en une série detokens qui peuvent être utilisés parJSONObject ouJSONArray pour analyser les chaînes JSON

  4. CDL - un outil qui fournit des méthodes pour convertir du texte délimité par des virgules en unJSONArray et vice versa

  5. Cookie - convertit de JSONString en cookies et vice versa

  6. HTTP - utilisé pour convertir de JSONString en en-têtes HTTP et vice versa

  7. JSONException - c'est une exception standard lancée par cette bibliothèque

4. JSONObject

UnJSONObject est une collection non ordonnée de paires de clés et de valeurs, ressemblant aux implémentations natives deMapde Java.

  • Les clés sont desStrings uniques qui ne peuvent pas être desnull

  • Les valeurs peuvent être n'importe quoi d'un objetBoolean,Number,String,JSONArray ou même un objetJSONObject.NULL

  • UnJSONObject peut être représenté par unString entre accolades avec des clés et des valeurs séparées par deux-points et des paires séparées par une virgule

  • Il a plusieurs constructeurs avec lesquels construire unJSONObject

Il prend également en charge les principales méthodes suivantes:

  1. get(String key) – gdéfinit l'objet associé à la clé fournie, renvoieJSONException si la clé n'est pas trouvée

  2. opt(String key)- gdéfinit l'objet associé à la clé fournie,null sinon

  3. put(String key, Object value) – insère ou remplace une paire clé-valeur dans lesJSONObject. actuels

La méthodeput() est une méthode surchargée qui accepte une clé de typeString et plusieurs types pour la valeur.

Pour la liste complète des méthodes prises en charge parJSONObject,visit the official documentation.

Voyons maintenant quelques-unes des principales opérations prises en charge par cette classe.

4.1. Création de JSON directement à partir deJSONObject

JSONObject expose une API similaire à l'interfaceMap de Java. Nous pouvons utiliser la méthodeput() et fournir la clé et la valeur comme argument:

JSONObject jo = new JSONObject();
jo.put("name", "jon doe");
jo.put("age", "22");
jo.put("city", "chicago");

Maintenant, nosJSONObject ressembleraient à:

{"city":"chicago","name":"jon doe","age":"22"}

Il existe sept signatures surchargées différentes de la méthodeJSONObject.put(). Alors que la clé ne peut être unique que, la valeur non nulleString,peut être n'importe quoi.

4.2. Création de JSON à partir de la carte

Au lieu de placer directement la clé et les valeurs dans unJSONObject, nous pouvons construire unMap personnalisé, puis le passer comme argument au constructeur deJSONObject.

Cet exemple produira les mêmes résultats que ci-dessus:

Map map = new HashMap<>();
map.put("name", "jon doe");
map.put("age", "22");
map.put("city", "chicago");
JSONObject jo = new JSONObject(map);

4.3. Création deJSONObject à partir de JSONString

Pour analyser un JSONString en unJSONObject, nous pouvons simplement passer leString au constructeur.

Cet exemple produira les mêmes résultats que ci-dessus:

JSONObject jo = new JSONObject(
  "{\"city\":\"chicago\",\"name\":\"jon doe\",\"age\":\"22\"}"
);

L'argumentString passé doit être un JSON valide sinon ce constructeur peut lancer unJSONException.

4.4. Sérialiser l'objet Java en JSON

L'un des constructeursJSONObject's prend un POJO comme argument. Dans l'exemple ci-dessous, le package utilise les getters de la classeDemoBean et crée unJSONObject approprié pour le même.

Pour obtenir unJSONObject à partir d'un objet Java, nous devrons utiliser une classe qui est unJava Bean valide:

DemoBean demo = new DemoBean();
demo.setId(1);
demo.setName("lorem ipsum");
demo.setActive(true);

JSONObject jo = new JSONObject(demo);

LesJSONObject jo pour cet exemple seront:

{"name":"lorem ipsum","active":true,"id":1}

Bien que nous puissions sérialiser un objet Java en chaîne JSON, il n’existe aucun moyen de le reconvertir à l’aide de cette bibliothèque.

Si nous voulons ce genre de flexibilité, nous pouvons passer à d'autres bibliothèques telles queJackson.

5. JSONArray

UnJSONArray est une collection ordonnée de valeurs, ressemblant à l'implémentation native deVector de Java.

  • Les valeurs peuvent être n'importe quoi d'un objetNumber,String,Boolean,JSONArray,JSONObject ou même un objetJSONObject.NULL

  • Il est représenté par unString encapsulé dans des crochets carrés et consiste en une collection de valeurs séparées par des virgules

  • CommeJSONObject, il a un constructeur qui accepte une sourceString et l'analyse pour construire unJSONArray

Voici les principales méthodes de la classeJSONArray:

  1. get(int index) – rrenvoie la valeur à l'index spécifié (entre 0 et la longueur totale - 1), sinon renvoie unJSONException

  2. opt(int index) - renvoie la valeur associée à un index (entre 0 et la longueur totale - 1). S'il n'y a pas de valeur à cet index, alors unnull est renvoyé

  3. put(Object value) - ajoute une valeur d'objet à ceJSONArray. Cette méthode est surchargée et prend en charge un large éventail de types de données

Pour une liste complète des méthodes prises en charge par JSONArray,visit the official documentation.

5.1. Création deJSONArray

Une fois que nous avons initialisé un objet JSONArray, nous pouvons simplement ajouter et récupérer des éléments à l'aide des méthodesput() etget():

JSONArray ja = new JSONArray();
ja.put(Boolean.TRUE);
ja.put("lorem ipsum");

JSONObject jo = new JSONObject();
jo.put("name", "jon doe");
jo.put("age", "22");
jo.put("city", "chicago");

ja.put(jo);

Voici le contenu de nosJSONArray (le code est formaté pour plus de clarté):

[
    true,
    "lorem ipsum",
    {
        "city": "chicago",
        "name": "jon doe",
        "age": "22"
    }
]

5.2. Création deJSONArray directement à partir de la chaîne JSON

CommeJSONObject, leJSONArray a également un constructeur qui crée un objet Java directement à partir d'un JSONString:

JSONArray ja = new JSONArray("[true, \"lorem ipsum\", 215]");

Ce constructeur peut lancer unJSONException si la sourceString n’est pas un JSONString valide.

5.3. Création deJSONArray directement à partir d'une collection ou d'un tableau

Le constructeur deJSONArray prend également en charge les objets collection et tableau comme arguments.

Nous les passons simplement en argument au constructeur et il retournera un objetJSONArray:

List list = new ArrayList<>();
list.add("California");
list.add("Texas");
list.add("Hawaii");
list.add("Alaska");

JSONArray ja = new JSONArray(list);

Maintenant, notreJSONArray se compose de:

["California","Texas","Hawaii","Alaska"]

6. JSONTokener

UnJSONTokener prend une sourceString comme entrée de son constructeur et en extrait des caractères et des jetons. Il est utilisé en interne par les classes de ce package (commeJSONObject,JSONArray) pour analyser JSONStrings.

Il se peut qu'il n'y ait pas beaucoup de situations où nous utiliserons directement cette classe car la même fonctionnalité peut être obtenue à l'aide d'autres méthodes plus simples (commestring.toCharArray()):

JSONTokener jt = new JSONTokener("lorem");

while(jt.more()) {
    Log.info(jt.next());
}

Nous pouvons maintenant accéder à unJSONTokener comme un itérateur, en utilisant la méthodemore() pour vérifier s'il reste des éléments etnext() pour accéder à l'élément suivant.

Les jetons reçus de l'exemple précédent seront:

l
o
r
e
m

7. CDL

Nous sommes fournis avec une classeCDL (Comma Delimited List) pour convertir le texte délimité par des virgules en unJSONArray et vice versa.

7.1. Production deJSONArray directement à partir de texte délimité par des virgules

Afin de produire unJSONArray directement à partir du texte délimité par des virgules, nous pouvons utiliser la méthode statiquerowToJSONArray() qui accepte unJSONTokener:

JSONArray ja = CDL.rowToJSONArray(new JSONTokener("England, USA, Canada"));

NotreJSONArray se compose désormais de:

["England","USA","Canada"]

7.2. Production de texte délimité par des virgules à partir de JSONArray

Pour inverser l'étape précédente et récupérer le texte délimité par des virgules à partir deJSONArray, nous pouvons utiliser:

JSONArray ja = new JSONArray("[\"England\",\"USA\",\"Canada\"]");
String cdt = CDL.rowToString(ja);

LesStringcdt contiennent maintenant:

England,USA,Canada

7.3. Production deJSONArray deJSONObjects à l'aide de texte délimité par des virgules

Pour produire unJSONArray deJSONObjects, nous utiliserons un texteString contenant à la fois des en-têtes et des données séparés par des virgules.

Les différentes lignes sont séparées par un retour chariot( ) ou un saut de ligne( ).

La première ligne est interprétée comme une liste d’en-têtes et toutes les lignes suivantes sont traitées comme des données:

String string = "name, city, age \n" +
  "john, chicago, 22 \n" +
  "gary, florida, 35 \n" +
  "sal, vegas, 18";

JSONArray result = CDL.toJSONArray(string);

L'objetJSONArray result se compose désormais de (sortie formatée par souci de clarté):

[
    {
        "name": "john",
        "city": "chicago",
        "age": "22"
    },
    {
        "name": "gary",
        "city": "florida",
        "age": "35"
    },
    {
        "name": "sal",
        "city": "vegas",
        "age": "18"
    }
]

Notez que dans cet exemple, les données et l'en-tête ont été fournis dans les mêmesString.There’s an alternative way of doing this where we can achieve the same functionality by supplying a JSONArray that would be used to get the headers and a comma-delimited String working as the data.

Différentes lignes sont séparées par un retour chariot( ) ou un saut de ligne( ):

JSONArray ja = new JSONArray();
ja.put("name");
ja.put("city");
ja.put("age");

String string = "john, chicago, 22 \n"
  + "gary, florida, 35 \n"
  + "sal, vegas, 18";

JSONArray result = CDL.toJSONArray(ja, string);

Ici, nous allons obtenir le contenu de l'objetresult exactement comme précédemment.

La classeCookie traite des cookies de navigateur Web et a des méthodes pour convertir un cookie de navigateur en unJSONObject et vice versa.

Voici les principales méthodes de la classeCookie:

  1. toJsonObject(String sourceCookie) – convertit une chaîne de cookie en unJSONObject

  2. toString(JSONObject jo) - c'est l'inverse de la méthode précédente, convertit unJSONObject en un cookieString.

Pour convertir un cookieString en unJSONObject, utilisez bien la méthode statiqueCookie.toJSONObject():

String cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; path=/";
JSONObject cookieJO = Cookie.toJSONObject(cookie);

Nous allons maintenant convertir unJSONObject en cookieString. C'est l'inverse de l'étape précédente:

String cookie = Cookie.toString(cookieJO);

9. HTTP

La classeHTTP contient des méthodes statiques qui sont utilisées pour convertir les en-têtes HTTP enJSONObject et vice versa.

Cette classe a également deux méthodes principales:

  1. toJsonObject(String sourceHttpHeader) – convertit unHttpHeader String enJSONObject

  2. toString(JSONObject jo) - convertit lesJSONObject fournis enString

9.1. Conversion deJSONObject en en-tête HTTP

La méthodeHTTP.toString() est utilisée pour convertir unJSONObject en en-tête HTTPString:

JSONObject jo = new JSONObject();
jo.put("Method", "POST");
jo.put("Request-URI", "http://www.example.com/");
jo.put("HTTP-Version", "HTTP/1.1");
String httpStr = HTTP.toString(jo);

Ici, nosString httpStr seront constitués de:

POST "http://www.example.com/" HTTP/1.1

Notez que lors de la conversion d'un en-tête de requête HTTP, lesJSONObject doivent contenir les clés“Method”,“Request-URI” et“HTTP-Version”, alors que, pour l'en-tête de réponse, l'objet doit contenir“HTTP-Version”, Paramètres“Status-Code” et“Reason-Phrase”.

9.2. Conversion de l'en-tête HTTPString enJSONObject

Ici, nous allons convertir la chaîne HTTP que nous avons obtenue à l'étape précédente enJSONObject que nous avons créés à cette étape:

JSONObject obj = HTTP.toJSONObject("POST \"http://www.example.com/\" HTTP/1.1");

10. JSONException

LeJSONException est l'exception standard levée par ce package chaque fois qu'une erreur est rencontrée.

Ceci est utilisé dans toutes les classes de ce paquet. L'exception est généralement suivie d'un message indiquant ce qui n'a pas fonctionné.

11. Conclusion

Dans ce didacticiel, nous avons examiné un JSON utilisant Java -org.json - et nous nous sommes concentrés sur certaines des fonctionnalités de base disponibles ici.

Les extraits de code complets utilisés dans cet article peuvent être trouvésover on GitHub.