JSON

JavaScript Object Notation : notation d'objet pour Javascript.

Motivation

Représenter des données dans une format optimisé pour le réseau.

En effet, le format JSON est né du constat de la surcharge imposée par les transferts de données en XML, lorsque celui-ci ne se justifie pas (pas de grammaire complexe, pas de validation).

Analyse

Un objet JSON est composé d'une suite de propriétés valuées, chaque valeur pouvant elle-même être un objet JSON.

Ne supporte pas les cycles.

Conception

Utiliser la notation Javascript définissant un objet

Implémentation

Des bibliothèques existent pour utiliser facilement JSON depuis divers langages comme Java, Javascript, C, C++, Objective C, PHP, etc.

Javascript

Accès

Les variables membres peuvent donc être récupérées via la notation pointée ou subscript.

myJSONObject.bindings[0].method // "newURI"

Instanciation

En tant que sous-ensemble de la notation litérale d'un objet en JavaScript, JSON peut être utilisé dans le langage :

var myJSONObject = { "bindings": [ {"ircEvent": "PRIVMSG", "method": "newURI", "regex":
                "^https://.*"}, {"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"}, {"ircEvent":
                "PRIVMSG", "method": "randomURI", "regex": "^random.*"} ] };

Un objet JSON provenant souvent d'autre part que le code qui va l'utiliser, on aura cependant typiquement besoin de l'instancier à partir de son texte récupéré. Pour cela on peut utiliser :

  • une évaluation de code qui le soumettra au "compilateur" JavaScript (entre parenthèses pour lever l'ambiguité sur le début d'un bloc de code) : var myObject = eval('(' + myJSONtext + ')'); Il s'agit cependant d'une solution risquée, le texte à évaluer pouvant aussi comporter n'importe quel code potentiellement malicieux.
  • un parseur d'objet qui ne comprendra que les objets au format JSON et jamais du code : var myObject = JSON.parse(myJSONtext, reviver); où le paramètre optionnel reviver est une fonction qui sera invoquée sur toute paire clé/valeur dans le cas où l'on souhaite personnaliser la réification. Par exemple :
    myData = JSON.parse(text, function (key, value) { var type; if (value &&
              typeof value === 'object') { type = value.type; if (typeof type === 'string' && typeof window[type]
              === 'function') { return new (window[type])(value); } } return value; } );

Sérialisation

Dans l'autre sens, envoyer un objet au format JSON peut se faire via un stringifier : var myJSONText = JSON.stringify(myObject, replacer); qui invoquera la méthode toJSON() sur l'objet pour le convertir, si elle existe. Ensuite, s'il est précisé, sera invoqué le replacer qui permet de personnaliser la chaîne JSON représentant une paire clé/valeur :

function replacer(key, value) { if (typeof value === 'number' && !isFinite(value)) {
            return String(value); } return value; }

Le replacer peut aussi être remplacé par un tableau des propriétés à sérialiser, si l'on veut juste pouvoir les choisir.

Les valeurs n'ayant pas de représentation JSON (fonctions, undefined, NaN, +infinity, -infinity) seront exclues (un replacer peut donc retourner undefined pour exclure la sérialisation d'une clé/valeur).

s1"JSON in JavaScript", JSON.org

Exemple

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