JSON, pour échanger des objects entre langages différents

JSON (JavaScript Object Notation) est un format de données pour l'échange entre le navigateur et le serveur. Sa syntaxe est similaire à celle d'un tableau associatif en JavaScript. En fait le format défini en 2002 a été basé sur un sous-ensemble de la spécification ECMA-252 du language.

Depuis PHP 5.2, l'extension JSON fait partie de l'installation par défaut de PHP. Elle propose les fonctions json_decode et json_encode qui respectivement transforment une chaîne en objet ou en objet en chaîne, la forme de chaîne permettant de stocker l'objet dans un fichier ou de le transmettre à une application JavaScript.

Tous les navigateurs modernes reconnaissent l'objet JSON qui permet de convertit un objet ou de l'afficher sous forme de chaîne arborescente.

JSON est même devenu un type de donnée dans PostgreSQL et MySQL (5.5.7) . Pour ces concurrents gratuit de Oracle, un contenu JSON peut être un type de donnée au même titre que INTEGER ou TEXT. De nouvelles commandes sont ajoutées pour l'utiliser. On peut aussi exprimer le résultat d'une requête en JSON.

Le format JSON reconnaît les même types de données que JavaScript:

Comment utiliser JSON en JavaScript

On lit un fichier JSON sur le serveur grâce à un parseur. Il en existe pour les langages de programmation les plus courants.
Dans une page web, il suffit de donner le contenu du fichier en argument à la fonction eval() pour retourner un tableau ou un objet utilisable directement par JavaScript.

var x = eval('(' + xhr.responseText + ')'); 

Par exemple le contenu assigné à l'attribut responseText de l'objet XMLHttpRequest lors d'une requête en Ajax peut devenir une objet dans un programme.

Avant d'assigner un objet en JavaScript avec la fonction eval, il est recommandé de purger le contenu avec une expression régulière pour éviter une injection possible de code malveillants.

var doc = xhr.responseText;
var obj = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.
   test( doc.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + doc + ')');

Ce code est donné dans le RFC 4627.

Comme il existe des parsers JSON pour tous les langages fonctionnant coté serveur, il est ainsi possible d'échanger des objets entre une application JavaScript et le backend, par exemple si c'est un script PHP:

JSON, JavaScript et PHP

On devrait maintenant remplacer eval par JSON.parse, puisque cela est maintenant supporté par tous les navigateurs.

JSON vs XML et autres formats alternatifs

Voici un exemple qui est un objet contenant un tableau. Les valeurs numériques sont inscrites telles quelles, tandis que les chaînes de caractères sont toujours entre guillemets.

Le fichier JSON:

{
   "menu": "Fichier",
   "commandes": 
   [
    {
     "title": "Nouveau",
     "action":"create"
    },  
    { 
     "title": "Ouvrir",
     "action": "open"
    },
    { 
     "title": "Quitter",
     "action": "exit"
    }
   ]
} 

Ce fichier est la représentation d'un menu, l'article cité plus loin fournit une démonstration de son utilisation.

L'équivalent XML:

<menu label="Fichier">
<menulist>
<command label="Nouveau" command="create" />
<command label="Ouvrir" command="open"/>
<command label="Quitter" command="exit" />
</menulist>
</menu>

La version XML est plus facile à lire, mais pour l'ordinateur, l'avantage est à JSON: plus léger, plus facile à parser, est similaire à un objet JavaScript.
Pour une comparaison plus détaillée, voir JSON ou XML, quel format choisir?

La validation des données peut se faire avec JSON Schema. Cela évitera de devoir changer de plateforme, comme l'a fait Uber, sous le motif que les données reçues n'ont pas toujours le format attendu.

Parmi les autres formats concurrents, citons YAML, plus complet mais aussi plus complexe et Protocol Buffers créé par Google pour ses serveurs. Ce dernier s'intègre mieux dans les langages autres que JavaScript car, à partir d'un prototype qui décrit les données (ce seraient les lignes de menu dans notre exemple) , le compilateur crée des classes dans le langage C++ ou Java pour y accéder. Mais cela convient plutôt pour des données statiques.

Références: Plus d'informations sur Json.org. Le site fournit un lien sur un parseur pour chaque langage de programmation. Voir aussi la spécification RFC 4627.