JavaScript Object Notation
JavaScript Object Notation (JSON) est un format de données textuel dérivé de la notation des objets du langage JavaScript. Il concurrence XML pour la représentation et la transmission d’information structurée[1].
JavaScript Object Notation
Créé par Douglas Crockford entre 2002 et 2005[2], la première norme du JSON est ECMA-404[3] d'Ecma International qui a été publiée en octobre 2003[4]. Il est également décrit en 2017 par la RFC 8259[5] de l’Internet Engineering Task Force qui se veut compatible avec Ecma-404 et ECMA-404.
Des bibliothèques pour le format JSON existent dans de nombreux langages de programmation[6].
Caractéristiques
Un texte en JSON comprend[7] - [6] :
- deux types composés :
- des objets JavaScript, ou ensembles de paires « nom » (ou « clé ») / « valeur ».
- des listes ordonnées de valeurs (tableau) .
- quatre types scalaires :
- des booléens : prend la valeur true ou false.
- des nombres : un nombre décimal signé qui peut contenir une part fractionnable ou élevée à la puissance. Le JSON n'admet pas les nombres inexistants (NaN), et ne distingue pas les entiers et les flottants.
- des chaînes de caractères : une séquence de 0 ou plus caractères Unicode. À l'instar des clés, elles sont obligatoirement entourées de guillemets.
- la valeur null : qualifie l'absence de valeur.
Chacun de ces types peut être utilisé pour constituer un document.
Exemple
Exemple de texte au format JSON :
{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{ "value": "New", "onclick": "CreateNewDoc()" },
{ "value": "Open", "onclick": "OpenDoc()" },
{ "value": "Close", "onclick": "CloseDoc()" }
]
}
}
}
Équivalent au format XML :
<menu id="file" value="File">
<popup>
<menuitem value="New" onclick="CreateNewDoc()"/>
<menuitem value="Open" onclick="OpenDoc()"/>
<menuitem value="Close" onclick="CloseDoc()"/>
</popup>
</menu>
Équivalent au format YAML :
menu:
id: file
value: File
popup:
menuitem:
- value: New
onclick: CreateNewDoc()
- value: Open
onclick: OpenDoc()
- value: Close
onclick: CloseDoc()
Commentaires
Par définition, JSON est un format d'échange de données (data interchange format). Donc, la RFC n'admet pas les commentaires, qui sont par nature des métadonnées (metadata)). Un analyseur syntaxique JSON strict détecte une erreur s'il rencontre un caractère non prévu par la spécification.
Il existe des initiatives de formats étendant JSON pour ajouter des commentaires (comme Hjson[8] pour Human JSON en anglais) et des logiciels permettant de restituer, à partir de ces formats dérivés, les JSON au format pur et strict. Toutefois, ces fichiers demandant alors une étape supplémentaire avant de pouvoir être lus par un interpréteur JSON standard, ils perdent légèrement en facilité d'interopérabilité.
On peut toujours ajouter une propriété à un champ dans un tableau associatif JSON, la nommer "_comment" (un usage qui se développe), et mettre un texte (le commentaire) dans le champ valeur :
{
"_comment": "Imported from Wikidata 2015-05-27 10:13.",
"QID": "Q5502001",
"label": "Adèle",
"description": "late 18th century, early 19th century French brig"
}
Durant la mise au point du format, Douglas Crockford constate que certains des premiers utilisateurs du JSON ajoutent des commentaires dans le but de donner des directives au parser[9], Ă l'image des instructions #ifdef
ou #define
du préprocesseur C. Il y voit un danger pour l'interopérabilité, une priorité du format, et décide de les retirer[9]. En 2012, il s'explique sur ce choix et reconnait être conscient de la tristesse des utilisateurs de ne pouvoir commenter ces fichiers[9].
Usages
Bien qu’utilisant une notation JavaScript, JSON est indépendant du langage de programmation (plusieurs dizaines de langages de programmation ont intégré JSON). JSON sert à faire communiquer des applications dans un environnement hétérogène. Il est notamment utilisé comme langage de transport de données par AJAX et les services Web. D’autres solutions sont possibles comme XML. Le type MIME application/json est utilisé pour le transmettre par le protocole HTTP.
Un document JSON représente un tableau associatif, implémenté en JavaScript par la classe Object, d’où le nom de ce premier. Il est donc potentiellement plus facile à interpréter qu’un XML qui imposera le recours à des techniques souvent plus lourdes qu’un accès direct, telle que le parcours hiérarchique de l’arbre DOM représenté par le document entier.
Il peut aussi être utilisé pour :
- la sérialisation et dé-sérialisation de tableaux associatifs ;
- l’encodage de documents ;
- l'encodage de données structurées ;
- les fichiers de configuration.
La syntaxe utilisée par les modules disponibles dans différents langages de programmation peut varier[10]. Par exemple, avec le module json de la librairie standard de Python il faudra adapter la syntaxe du langage Python qui diffère de celle utilisée par le format JSON :
- Pour les chaînes de caractères, seuls les guillemets doubles sont acceptés.
- Les booléens s'écrivent tout en minuscule (
true
etfalse
). - L'objet
None
est représenté parnull
Évaluation
En JavaScript, il est simple d’évaluer une expression JSON pour la transformer en Object natif :
var donnees = eval('('+donnees_json+')');
Cette méthode comporte toutefois des risques car la chaîne de caractères donnees_json
peut contenir n’importe quel code JavaScript. Il existe une méthode plus sûre qui consiste à analyser la syntaxe de la chaîne de caractères donnees_json
, seule solution disponible dans les autres langages de programmation, à l’exception de Python, la syntaxe de JSON correspondant à ses deux types principaux : les listes et les dictionnaires.
À partir de 2009, les navigateurs commencent à intégrer un support natif du format JSON. Cela facilite sa manipulation, la sécurité (contre l’évaluation de scripts malveillants inclus dans une chaîne JSON), et la rapidité de traitement. Ainsi les navigateurs Firefox 3.5, IE 8 ou encore Opera 10.5 l’intègrent en natif[11].
Évaluer en JavaScript une expression JSON pour la transformer en Object se fait alors de la manière suivante :
var donnees = JSON.parse(donnees_json);
Différentes bibliothèques javascript permettent de supporter des navigateurs plus anciens avec une syntaxe similaire.
Extensions du format
JSONP
JSONP ou JSON-P (pour JSON with padding, en français, « JSON avec formatage ») est une extension dans laquelle le nom de la fonction de retour est indiqué[12]. L’idée originale proviendrait du blog de Bob Ippolito en 2005[13] et est maintenant répandue dans les applications Web 2.0, telle que Google’s toolkit Applications[14]. Des améliorations sont prévues pour y ajouter des arguments[15].
JSONP utilise des balises de scripts, les appels sont ouverts. Ainsi, JSONP peut être inapproprié pour transporter des informations confidentielles.
JSON5
JSON5 est une extension de la syntaxe du JSON, destiné à contourner les limitations de ce dernier.
Spécifications
- Les noms des champs ne sont plus entre guillemets
- Support des commentaires (sur une ou plusieurs lignes)
- Les nombres peuvent être représentés au format hexadécimal, être précédés du signe positif (+), avoir pour valeur Infinity ou NaN
- Espaces blancs supplémentaires autorisés
- Les chaînes de caractères peuvent être contenus entre apostrophes
HJSON
HJSON est une extension de la syntaxe JSON, ayant le mĂŞme objectif que JSON5 (voir ci-dessus).
Spécifications
- Les champs peuvent être séparés par un retour à la ligne au lieu d'une virgule
- Possibilité d'écrire des commentaires (#, //, /* ... */)
- L'utilisation des guillemets pour encapsuler une chaîne de caractères n'est pas obligatoire
- Les chaînes de caractères peuvent être écrites sur plusieurs lignes
Annexes
Articles connexes
- BSON (Binary JSON) : un format étendant les possibilités du JSON (données temporelles, binaires, etc.), notamment utilisé par MongoDB ;
- TopoJSON : un format de stockage des données topologiques ;
- GeoJSON : un format de stockage des données géographiques ;
- YAML : un autre langage de sérialisation de données.
- JSON-LD : (pour JavaScript Object Notation for Link Data) est un standard du W3C pour structurées des données sur le web en utilisant du JSON[16] - [17].
Notes et références
- « Structuration des donnees: XML et JSON », sur wdi.supelec.fr (consulté le )
- +Bastien L, « JSON : tout savoir sur le format de données JavaScript Object Notation », sur LeBigData.fr, (consulté le )
- http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
- « https://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-404%201st%20edition%20October%202013.pdf »
- (en) « RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format », IETF Datatracker,‎ (lire en ligne, consulté le )
- « JSON », sur www.json.org (consulté le )
- Stéphane Crozat, Julien Jerphanion, Harold Carrel-Billiard, Maxime Uzan et Cécile Fecherolle, « JavaScript Object Notation [Introduction aux bases de données NoSQL] », sur librecours.net (consulté le )
- (en) « Hjson, a user interface for JSON », sur hjson.github.io (consulté le )
- Douglas Crockford, « Comments in JSON », sur Publications du compte Google+ de Douglas Crockford, (consulté le )
- « Qu'est-ce que le format JSON ? », sur Docstring (consulté le )
- (en) « Can I use... JSON parsing », sur caniuse.com (consulté le )
- « Une requête inter-domaine à l'aide de JSONP », sur www.journaldunet.com (consulté le )
- (en) « Remote JSON - JSONP », .
- (en) « GWT Tutorial: How to Read Web Services Client-Side with JSONP ».
- (en) « JSONPP », .
- (en) W3C, « The JSON-LD Vocabulary »,
- (en) « Home - schema.org », sur schema.org (consulté le )