JSON

Notions de base

Wikipédia :

JSON (JavaScript Object Notation) est un format de données textuelles dérivé de la notation des objets du langage JavaScript. Il permet de représenter de l’information structurée comme le permet XML par exemple. Créé par Douglas Crockford entre 2002 et 2005, il est décrit par la RFC 7159 de l’IETF.

Par définition, JSON est un format d’échange de données.

Site web : json.org

Un document JSON ne comprend que deux types d’éléments structurels :

  • des ensembles de paires « nom » (alias « clé ») / « valeur » : "id": "file"
  • des listes de valeurs séparées par des virgules : "value": "New", "onclick": "CreateNewDoc()".

Ces mêmes éléments représentent trois types de données :

  • des objets : { ... } ;
  • des tableaux : [ ... ] ;
  • des valeurs génériques de type tableau, objet, booléen, nombre, chaîne de caractères ou null (valeur vide).

Exemple de format JSON :

{
    "menu": {
        "id": "file",
        "value": "File",
        "popup": {
            "menuitem": [
                { "value": "New", "onclick": "CreateNewDoc()" },
                { "value": "Open", "onclick": "OpenDoc()" },
                { "value": "Close", "onclick": "CloseDoc()" }
            ]
        }
    }
}

Remarque : l’extension des fichiers au format JSON est .json.

Même si le format est simple, il est possible d’utiliser un validateur en ligne.

Site web : json.org

Avantages

On peut citer :

  • peu verbeux, ce qui le rend lisible aussi bien par un humain que par une machine ;
  • facile à apprendre, car sa syntaxe est réduite et non extensible (bien qu’il souffre de quelques limitations) ;
  • ses types de données sont connus et simples à décrire ;
  • simple à mettre en œuvre par un développeur

Invénients

Le JSON ne permet pas :

  • de représenter d’autres types (format Date, couleurs, …). On utilise donc des représentations sous forme de chaînes de caractères ;
  • de sécuriser les données : pas de limite fixe pour les valeurs des entiers, pas de nombres inexistants (NaN), aucune distinction entre entier et flottant ;
  • les commentaires utiles pour certains types de fichier (configuration par exemple).

Utilisations

Bien qu’utilisant une notation JavaScript, JSON est indépendant du langage de programmation. Étant un format d’échanges de données, JSON sert essentiellement à faire communiquer des applications dans un environnement hétérogène (AJAX et les services Web par exemple).

Il peut aussi être utilisé pour :

  • la sérialisation et désérialisation d’objets ;
  • les fichiers de configuration.

Des bibliothèques pour JSON existent dans la plupart des langages de programmation.

En JavaScript, un document JSON représente un objet :

 var objet = JSON.parse(donnees_json);

Android

Exemple de données JSON :

{
    "classe": "2btssn",
    "active": true,
    "nb": 3, 
    "moyenne": 14.42,
    "etudiants": [
        { "prénom": "John", "nom": "Doe", "age": 19 },
        { "prénom": "Jane", "nom": "Doe" , "age": 19 },
        { "prénom": "Robert", "nom": "Smith" , "age": 18 }
    ]
}
import org.json.JSONObject;
import org.json.JSONArray;
import org.json.JSONException;

public class MainActivity extends AppCompatActivity
{
    private final String TAG = "JSON";
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try
        {
            String s = null;
            JSONObject json = null;
            Iterator<String> it = null;
            
            s = new String("{\n" +
                    "  \"classe\": \"2btssn\",\n" +
                    "  \"active\": true,\n" +
                    "  \"nb\": 3,\n" +
                    "  \"moyenne\": 14.42,\n" +
                    "  \"etudiants\": [\n" +
                            "{ \"prénom\": \"John\", \"nom\": \"Doe\", \"age\": 19 },\n" +
                            "{ \"prénom\": \"Jane\", \"nom\": \"Doe\" , \"age\": 19 },\n" +
                            "{ \"prénom\": \"Robert\", \"nom\": \"Smith\" , \"age\": 18 }\n" +
                        "]\n" +
                    "}");
            
            json = new JSONObject(s);

            it = json.keys();
            while (it.hasNext())
            {
                String cle = it.next();
                Log.i(TAG, "clé = " + cle);
                Log.i(TAG, "valeur = " + json.getString(cle));
                Log.i(TAG, "type = " + json.get(cle).getClass());
            }
        }
        catch (JSONException e)
        {
            e.printStackTrace();
        }
    }
}

On obtient :

2020-03-01 16:35:19.036 22136-22136/com.example.myapplicationjson I/JSON: clé = active
2020-03-01 16:35:19.036 22136-22136/com.example.myapplicationjson I/JSON: valeur = true
2020-03-01 16:35:19.036 22136-22136/com.example.myapplicationjson I/JSON: type = class java.lang.Boolean
2020-03-01 16:35:19.036 22136-22136/com.example.myapplicationjson I/JSON: clé = nb
2020-03-01 16:35:19.036 22136-22136/com.example.myapplicationjson I/JSON: valeur = 3
2020-03-01 16:35:19.036 22136-22136/com.example.myapplicationjson I/JSON: type = class java.lang.Integer
2020-03-01 16:35:19.036 22136-22136/com.example.myapplicationjson I/JSON: clé = moyenne
2020-03-01 16:35:19.037 22136-22136/com.example.myapplicationjson I/JSON: valeur = 14.42
2020-03-01 16:35:19.037 22136-22136/com.example.myapplicationjson I/JSON: type = class java.lang.Double
2020-03-01 16:35:19.037 22136-22136/com.example.myapplicationjson I/JSON: clé = etudiants
2020-03-01 16:35:19.037 22136-22136/com.example.myapplicationjson I/JSON: valeur = [{"prénom":"John","nom":"Doe","age":19},{"prénom":"Jane","nom":"Doe","age":19},{"prénom":"Robert","nom":"Smith","age":18}]
2020-03-01 16:35:19.037 22136-22136/com.example.myapplicationjson I/JSON: type = class org.json.JSONArray

Remarque : Les clés/valeurs ne sont pas ordonnées dans un document JSON : cela signifie que l’ordre n’est pas important. Android ordonne les clés alphabétiquement mais cela n’aura pas de répercussion pour JSON.

On peut extraire et parcourir le tableau JSONArray :

...
JSONArray array = json.getJSONArray("etudiants");
Log.i(TAG, "Nb éléments du tableau : " + array.length());
for (int i=0; i<array.length(); i++)
    Log.i(TAG, "Étudiant = " + array.getJSONObject(i).getString("prénom") + " " + array.getJSONObject(i).getString("nom") + " " + array.getJSONObject(i).getString("age") + " ans");

On obtient :

...
2020-03-01 16:39:14.477 22872-22872/com.example.myapplicationjson I/JSON: clé = etudiants
2020-03-01 16:39:14.477 22872-22872/com.example.myapplicationjson I/JSON: valeur = [{"prénom":"John","nom":"Doe","age":19},{"prénom":"Jane","nom":"Doe","age":19},{"prénom":"Robert","nom":"Smith","age":18}]
2020-03-01 16:39:14.477 22872-22872/com.example.myapplicationjson I/JSON: type = class org.json.JSONArray
2020-03-01 16:39:14.477 22872-22872/com.example.myapplicationjson I/JSON: Nb éléments du tableau : 3
2020-03-01 16:39:14.477 22872-22872/com.example.myapplicationjson I/JSON: Étudiant = John Doe 19 ans
2020-03-01 16:39:14.477 22872-22872/com.example.myapplicationjson I/JSON: Étudiant = Jane Doe 19 ans
2020-03-01 16:39:14.477 22872-22872/com.example.myapplicationjson I/JSON: Étudiant = Robert Smith 18 ans

On peut simplement extraire des valeurs :

...
if(json.has("classe"))
    Log.i(TAG, "Classe = " + json.getString("classe"));
if(json.has("moyenne"))
    Log.i(TAG, "Moyenne = " + json.getDouble("moyenne"));

On obtient alors :

...
2020-03-01 16:45:28.035 23279-23279/com.example.myapplicationjson I/JSON: Classe = 2btssn
2020-03-01 16:45:28.035 23279-23279/com.example.myapplicationjson I/JSON: Moyenne = 14.42

Pour créer des données JSON, on procédera ainsi :

try
{
    JSONObject objet = new JSONObject();
    objet.put("classe", "1btssn");
    objet.put("active", true);
    objet.put("nb", 2);
    objet.put("moyenne", 12.42);
    JSONArray etudiants = new JSONArray();
    JSONObject etudiant1 = new JSONObject();
    etudiant1.put("nom", "Dalton");
    etudiant1.put("prénom", "Joe");
    etudiant1.put("age", 18);
    etudiants.put(etudiant1);
    JSONObject etudiant2 = new JSONObject();
    etudiant2.put("nom", "Dalton");
    etudiant2.put("prénom", "Jack");
    etudiant2.put("age", 18);
    etudiants.put(etudiant2);
    objet.put("etudiants", etudiants);
    Log.i(TAG, "JSON = " + objet.toString());
}
catch (JSONException e)
{
    e.printStackTrace();
}

On obtient alors :

2020-03-02 08:21:32.775 3041-3041/com.example.myapplicationjson I/JSON: JSON = {"classe":"1btssn","active":true,"nb":2,"moyenne":12.42,"etudiants":[{"nom":"Dalton","prénom":"Joe","age":18},{"nom":"Dalton","prénom":"Jack","age":18}]}

Il est possible de supprimer un élément :

objet.remove("nb");
Log.i(TAG, "JSON = " + objet.toString());

On obtient alors :

2020-03-02 08:24:22.342 5062-5062/com.example.myapplicationjson I/JSON: JSON = {"classe":"1btssn","active":true,"moyenne":12.42,"etudiants":[{"nom":"Dalton","prénom":"Joe","age":18},{"nom":"Dalton","prénom":"Joe","age":18}]}

© Thierry Vaira <tvaira@free.fr>