Aller au contenu

JavaScript Object Notation

Un article de Wikipédia, l'encyclopédie libre.

JSON
JavaScript Object Notation
Image
logo du format JSON
Caractéristiques
Extension
.jsonVoir et modifier les données sur Wikidata
Type MIME
application/jsonVoir et modifier les données sur Wikidata
PUID
Développé par
Version initiale
2001
Type de format
Texte
Basé sur
Norme
RFC 8259 et ECMA-404
Spécification
Site web

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].

Imaginé par Douglas Crockford, le format JSON a été introduit pour la première fois sur la page json.org en 2001[2]. Cette démarche a conduit à sa standardisation ultérieure sous la norme ECMA-404 d'Ecma International, dont la première édition a été publiée en [2]. Une deuxième édition de la norme a été publiée en décembre 2017[3].

Il est également décrit par la RFC 8259[4] publiée en 2017 par l’Internet Engineering Task Force, qui remplace notamment les RFC 4627[5] et RFC 7159[6] et se veut compatible avec ECMA-404[7]

Des bibliothèques pour le format JSON existent dans de nombreux langages de programmation[8],[7].

Caractéristiques

[modifier | modifier le code]

Un texte en JSON peut contenir[9],[8], [7] :

  • deux types composés :
    • des objets, ou ensembles de paires « nom » (ou « clé ») / « valeur » ;
    • des listes ordonnées de valeurs (tableaux) ;
  • quatre types scalaires :
    • des booléens, qui prennent la valeur true ou false ;
    • des nombres, écrits en notation décimale et pouvant comporter une partie fractionnaire ou un exposant. JSON n'admet ni les nombres inexistants (NaN) ni les valeurs infinies et ne distingue pas les entiers des nombres à virgule flottante ;
    • des chaînes de caractères, constituées d'une séquence de zéro ou plusieurs caractères Unicode et obligatoirement entourées de guillemets doubles ;
    • la valeur null, qui qualifie l'absence de valeur.

Chacun de ces types peut être utilisé pour constituer un document[7].

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

[modifier | modifier le code]

JSON est un format d'échange de données dont la syntaxe définie par la RFC n'admet pas les commentaires[7]. Un analyseur syntaxique JSON strict détecte une erreur s'il rencontre un caractère ou une construction non prévu par la spécification.

Il existe des initiatives de formats étendant JSON pour ajouter des commentaires, comme Hjson[10], pour Human JSON en anglais, ou JSON5[11]. Ces formats permettent de restituer du JSON standard, mais nécessitent un analyseur compatible avec leur syntaxe propre[12].

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 parseur[13], à 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[13]. En 2012, il s'explique sur ce choix et reconnaît être conscient de la gêne que cette absence peut occasionner[13].

Bien qu’utilisant une notation issue de JavaScript, JSON est indépendant du langage de programmation[2]. De nombreux langages de programmation disposent d'outils permettant de le lire ou de le produire[7]. JSON sert à faire communiquer des applications dans un environnement hétérogène. Il est notamment utilisé comme format de transport de données avec AJAX et les services Web. D’autres solutions sont possibles, comme XML.

Le type de média MIME application/json est enregistré pour le transmettre notamment par le protocole HTTP[7].

Lorsqu'un texte JSON est échangé entre des systèmes qui ne font pas partie d'un même environnement fermé, la RFC 8259 impose l'utilisation de l'encodage UTF-8[7].

Un document JSON n'est pas nécessairement un tableau associatif : sa valeur de plus haut niveau peut être un objet, un tableau, une chaîne de caractères, un nombre, un booléen ou null[7].

Il peut aussi être utilisé pour :

La correspondance entre les valeurs JSON et les types natifs varie selon les langages de programmation. Par exemple, avec le module json de la bibliothèque standard de Python[14] :

  • les objets JSON correspondent notamment aux dictionnaires (dict) ;
  • les tableaux JSON correspondent notamment aux listes (list) ;
  • les chaînes de caractères JSON correspondent aux chaînes Python ;
  • les booléens true et false correspondent respectivement à True et False ;
  • la valeur null correspond à None.

Évaluation

[modifier | modifier le code]

En JavaScript, il est possible d'utiliser la fonction eval() pour interpréter certains textes JSON :

 var donnees = eval('('+donnees_json+')');

Cette méthode comporte toutefois des risques car la chaîne de caractères donnees_json peut contenir du code JavaScript exécutable. La RFC 8259 considère l'utilisation d'eval() pour analyser du JSON comme un risque de sécurité et recommande l'emploi d'un analyseur dédié[7].

À partir de 2009, les navigateurs commencent à intégrer un support natif du format JSON. Cela facilite sa manipulation et évite d'avoir recours à eval(). Ainsi les navigateurs Firefox 3.5, IE 8 ou encore Opera 10.5 l’intègrent en natif[15].

Analyser en JavaScript une chaîne JSON peut alors se faire avec JSON.parse() :

 var donnees = JSON.parse(donnees_json);

L'objet standard JSON, qui comprend notamment les méthodes JSON.parse() et JSON.stringify(), a été intégré à la cinquième édition de la norme ECMAScript, publiée en décembre 2009[16].

Différentes bibliothèques JavaScript ont également permis de prendre en charge les navigateurs plus anciens avec une syntaxe similaire.

Extensions du format

[modifier | modifier le code]

Le format JSONL est une implémentation de JSON ligne-à-ligne[17],[18]. Chaque ligne contient une valeur JSON valide[17].

JSONL (JSON Lines) est également rapproché du format NDJSON (Newline Delimited JSON), dans lequel les textes JSON sont séparés par des retours à la ligne[19].

JSONP ou JSON-P (pour JSON with Padding, en français « JSON avec remplissage ») est une technique dans laquelle des données JSON sont incluses dans un appel à une fonction JavaScript[20].

L’idée a été proposée par Bob Ippolito en 2005[21]. Elle permettait notamment à une page Web de charger des données depuis une autre origine par l'intermédiaire d'une balise <script>[21].

Cette technique s'est répandue dans des applications du Web 2.0, notamment dans certains outils destinés à Google Web Toolkit[22].

Une extension appelée JSONPP a également été proposée afin d'ajouter des paramètres supplémentaires à ce principe[23].

JSONP repose sur l'exécution d'un script provenant d'une autre origine et peut donc présenter des risques lorsqu'il est utilisé pour transmettre des informations sensibles. L'OWASP recommande notamment de ne pas activer JSONP afin d'éviter certaines attaques par inclusion de scripts provenant d'un autre site[24].

JSON5 est une extension de la syntaxe de JSON, destinée à rendre son écriture manuelle plus souple[11].

Spécifications

[modifier | modifier le code]

Par rapport à JSON, JSON5 autorise notamment[11] :

  • certains noms de champs sans guillemets ;
  • les commentaires sur une ou plusieurs lignes ;
  • une virgule finale dans les objets et les tableaux ;
  • les nombres représentés au format hexadécimal ;
  • les nombres précédés du signe positif (+) ;
  • les valeurs Infinity et NaN ;
  • des caractères d'espacement supplémentaires ;
  • les chaînes de caractères délimitées par des apostrophes ;
  • certaines chaînes de caractères réparties sur plusieurs lignes.

HJSON est une extension de la syntaxe JSON destinée notamment aux fichiers de configuration et aux données devant être lues ou modifiées directement par une personne[10],[25].

Spécifications

[modifier | modifier le code]

Hjson permet notamment[25] :

  • de séparer les champs par un retour à la ligne au lieu d'une virgule ;
  • d'écrire des commentaires avec #, // ou /* ... */ ;
  • d'omettre les guillemets autour de certaines clés et chaînes de caractères ;
  • d'utiliser des virgules finales ;
  • d'écrire des chaînes de caractères sur plusieurs lignes ;
  • d'omettre les accolades entourant l'objet situé à la racine dans certains cas.

Sur les autres projets Wikimedia :

Articles connexes

[modifier | modifier le code]

Liens externes

[modifier | modifier le code]

Références

[modifier | modifier le code]
  1. ↑ « Structuration des donnees : XML et JSON », sur wdi.supelec.fr (consulté le ).
  2. 1 2 3 ECMA International, Standard ECMA-404 : The JSON Data Interchange Syntax, 114 Rue du Rhône, CH-1204 Geneva, ECMA International, , 2e éd., 16 p. (lire en ligne), Introduction
  3. ↑ (en) « ECMA-404 — The JSON data interchange syntax », sur Ecma International (consulté le )
  4. 1 2 (en) Tim Bray, « RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format », Request for comments no 8259,
  5. ↑ (en) Request for comments no 4627
  6. ↑ (en) Request for comments no 7159
  7. 1 2 3 4 5 6 7 8 9 10 RFC 8259[4]
  8. 1 2 « JSON », sur www.json.org (consulté le ).
  9. ↑ 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 via Internet Archive (consulté le ).
  10. 1 2 (en) « Hjson, a user interface for JSON », sur hjson.github.io (consulté le ).
  11. 1 2 3 (en) « The JSON5 Data Interchange Format », sur JSON5 (consulté le )
  12. ↑ (en) « Hjson Syntax », sur Hjson (consulté le )
  13. 1 2 3 (en) « Comments in JSON », sur google.com via Internet Archive (consulté le )
  14. ↑ « json — Encodage et décodage JSON », sur Documentation Python, Python Software Foundation (consulté le )
  15. ↑ (en) « Can I use... JSON parsing », sur caniuse.com (consulté le ).
  16. ↑ (en) « ECMA-262, 5th edition, December 2009 », sur Ecma International, (consulté le ), p. 15.12
  17. 1 2 « JSON Lines », sur jsonlines.org (consulté le )
  18. ↑ (en) Andy Brudtkuhl, « What is JSONL? An Introduction to JSON Lines Format », sur jsonltools.com (consulté le )
  19. ↑ (en) ndjson, « Update specification_draft2.md · ndjson/ndjson-spec@c658c26 », sur GitHub (consulté le )
  20. ↑ « Une requête inter-domaine à l'aide de JSONP »(Archive.org • Wikiwix • Que faire ?), sur www.journaldunet.com (consulté le ).
  21. 1 2 (en) « Remote JSON - JSONP », sur ippoli.to, (consulté le ).
  22. ↑ (en) « GWT Tutorial : How to Read Web Services Client-Side with JSONP », sur gwtapps.com via Internet Archive (consulté le ).
  23. ↑ (en) « JSONPP », .
  24. ↑ (en) « Cross Site Script Inclusion », sur OWASP Web Security Testing Guide (consulté le )
  25. 1 2 (en) « The Human JSON (Hjson) Configuration Format », sur Hjson (consulté le )
  26. ↑ (en) W3C, « The JSON-LD Vocabulary », sur w3.org, (consulté le ).
  27. ↑ (en) « Home - schema.org », sur schema.org (consulté le ).
  28. ↑ (en) W3C, « JSON-LD 1.1 — A JSON-based Serialization for Linked Data », sur W3C, (consulté le )