JavaScript Object Notation

Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis JSON)
Sauter à la navigation Sauter à la recherche

JSON
Javascript Object Notation
JSON vector logo.svg
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
2002
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 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 actuellement décrit par deux normes en concurrence : RFC 8259 de l’IETF et ECMA-404[1] de l'ECMA.

La dernière version des spécifications du format date de décembre 2017.

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

Caractéristiques[modifier | modifier le code]

Un document JSON comprend deux types d'éléments structurels :

  • des ensembles de paires « nom » (alias « clé ») / « valeur »
  • des listes ordonnées de valeurs

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

Exemple[modifier | modifier le code]

Exemple de données 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()

Typage[modifier | modifier le code]

Les six types de base du format JSON sont les suivants :

  1. Chaîne 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[2] (non interchangeables avec des apostrophes).
  2. Nombre : un nombre décimal signé qui peut contenir une part fractionnable ou élevée à la puissance (notation E). Le Json n'admet pas les nombres inexistants (NaN), et ne fait aucune distinction entre un entier et un flottant.
  3. Booléen : true ou false sont utilisés pour définir l'état du booléen.
  4. Type null : une valeur vide, utilisant le mot clé null.
  5. Tableau.
  6. Objet.

Commentaires[modifier | modifier le code]

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)). Les parsers JSON stricts généreront une exception lorsqu'ils rencontreront un caractère non prévu par la specification (comme le / de // ou /* qui débutent les commentaires JavaScript).

Il existe des initiatives de formats surchargeant le JSON pour permettre d'y ajouter des commentaires (comme Hjson (Human JSON)) 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é de l'objet représenté par le 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, David Crockfrod constate que certains des premiers utilisateurs du JSON ajoutent des commentaires dans le but de donner des directives au parser[3], à 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[3]. En 2012, il s'explique sur ce choix et reconnait être conscient de la tristesse des utilisateurs de ne pouvoir commenter ces fichiers[3].

Avantages et inconvénients[modifier | modifier le code]

Avantages[modifier | modifier le code]

Ces types de données sont suffisamment génériques et abstraits pour, d’une part, pouvoir être représentés dans n’importe quel langage de programmation et d’autre part, pouvoir représenter n’importe quelle donnée concrète.

Le principal avantage de JSON est qu’il est simple à mettre en œuvre par un développeur tout en étant complet.

Au rang des avantages, on peut également 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.

Inconvénients[modifier | modifier le code]

Le JSON ne peut représenter que quelques types généraux, et il n'est pas possible d'en ajouter d'autres. Pour les dates ou les couleurs par exemple, il faut trouver des représentations sous forme de chaînes de caractères. C'est sa principale différence avec un langage comme le XML, où les données sont typées et extensibles, au prix d'une plus grande complexité.

Ce typage faible affaiblit la sécurité et la fiabilité du langage ; par exemple, il n'y a pas de limite fixe pour les valeurs des entiers, celle-ci dépend de l'interpréteur.

D'un point de vue plus pratique, il ne peut pas y avoir de commentaires, ce qui est gênant quand on utilise des fichiers JSON dans une configuration. Certaines bibliothèques acceptent les commentaires au format JavaScript.

Usages[modifier | modifier le code]

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.

Vis-à-vis de JavaScript, un document JSON représente un objet, d’où son nom. 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 :

Évaluation[modifier | modifier le code]

En JavaScript, il est simple d’évaluer une expression JSON pour la transformer en objet 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.

Évaluer en JavaScript une expression JSON pour la transformer en objet 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[modifier | modifier le code]

JSONP[modifier | modifier le code]

JSONP (pour JSON with padding, en français, « JSON avec formatage ») est une extension dans laquelle le nom de la fonction de retour est indiqué. L’idée originale proviendrait du blog de Bob Ippolito en 2005[4] et est maintenant répandue dans les applications Web 2.0, telle que Google’s toolkit Applications[5]. Des améliorations sont prévues pour y ajouter des arguments[6].

JSONP utilise des balises de scripts, les appels sont ouverts. Ainsi, JSONP peut être inapproprié pour transporter des informations confidentielles.

JSON5[modifier | modifier le code]

JSON5 est une extension de la syntaxe du JSON, destiné à contourner les limitations de ce dernier.

Spécifications[modifier | modifier le code]

  • 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é du signe positif (+), avoir pour valeur Infinity ou NaN
  • Possibilité d'afficher le signe positif pour les nombres
  • Espaces blancs supplémentaires autorisés
  • Les chaînes de caractères peuvent être contenus entre apostrophes

HJSON[modifier | modifier le code]

HJSON est une extension de la syntaxe JSON, ayant le même objectif que JSON5 (voir ci-dessus).

Spécifications[modifier | modifier le code]

  • 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 ne sont pas obligatoires
  • Les chaînes de caractères peuvent être écrites sur plusieurs lignes

Annexes[modifier | modifier le code]

Sur les autres projets Wikimedia :

Articles connexes[modifier | modifier le code]

  • 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

Liens externes[modifier | modifier le code]

Notes et références[modifier | modifier le code]

  1. http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
  2. http://www.json.org/
  3. a b et c Douglas Crockford, « Comments in JSON », sur Publications du compte Google+ de Douglas Crockford, (consulté le 27 mai 2015)
  4. (en) « Remote JSON - JSONP », .
  5. (en) « GWT Tutorial: How to Read Web Services Client-Side with JSONP ».
  6. (en) « JSONPP », .