JSON - JSON

Notation d'objet JavaScript
Logo vectoriel JSON.svg
Extension de nom de fichier
.json
Type de média Internet
application/json
Tapez le code TEXTE
Identificateur de type uniforme (UTI) public.json
Type de format Échange de données
Prolongé de JavaScript
Standard STD 90 ( RFC  8259 ), ECMA-404 , ISO/IEC 21778:2017
Format ouvert ? Oui
Site Internet JSON .org

JSON ( JavaScript Object Notation , prononcé / s ən / ; aussi / ˌ s ɒ n / ) est un standard ouvert format de fichier et l' échange de données format utilisations lisible par l' homme texte pour stocker des données et transmettre des objets comprenant paires et tableaux attribut–valeur (ou autres valeurs sérialisables ). Il s'agit d'un format de données commun avec une gamme variée de fonctionnalités dans l'échange de données, y compris la communication d' applications Web avec des serveurs .

JSON est un format de données indépendant de la langue . Il est dérivé de JavaScript , mais de nombreux langages de programmation modernes incluent du code pour générer et analyser des données au format JSON. Les noms de fichiers JSON utilisent l'extension .json.

Douglas Crockford a initialement spécifié le format JSON au début des années 2000.

Dénomination et prononciation

L'acronyme provient de State Software, une société co-fondée par Douglas Crockford et d'autres en mars 2001.

2017 norme internationale (ECMA-404 et ISO / IEC 21778: 2017) spécifie "Pronounced / . De la ə n / , comme dans ' Jason et les Argonautes ' ". La première édition (2013) de l'ECMA-404 n'a pas abordé la prononciation. Le manuel d'administration système UNIX et Linux indique que « Douglas Crockford , qui a nommé et promu le format JSON, dit qu'il se prononce comme le nom Jason. Crockford a déclaré en 2011, "Il y a beaucoup d'arguments sur la façon dont vous prononcez cela, mais je m'en fiche strictement."

Normes

Après que la RFC  4627 soit disponible en tant que spécification « informationnelle » depuis 2006, JSON a été normalisé pour la première fois en 2013, sous le nom ECMA -404. La RFC  8259 , publiée en 2017, est la version actuelle de la norme Internet STD 90 , et elle reste cohérente avec l'ECMA-404. La même année, JSON a également été normalisé en tant qu'ISO / IEC 21778:2017. Les normes ECMA et ISO ne décrivent que la syntaxe autorisée, tandis que la RFC couvre certaines considérations de sécurité et d'interopérabilité.

Histoire

Douglas Crockford au Yahoo Building (2007)

JSON est né d'un besoin d'un protocole de communication serveur-navigateur en temps réel et sans état , sans utiliser de plug-ins de navigateur tels que les applets Flash ou Java , les méthodes dominantes utilisées au début des années 2000.

Un précurseur des bibliothèques JSON a été utilisé dans un projet de jeu d'échange d'actifs numériques pour enfants nommé Cartoon Orbit sur Communities.com (sur lequel les cofondateurs de State Software avaient tous travaillé auparavant) pour Cartoon Network, qui utilisait un plug-in côté navigateur avec un format de messagerie propriétaire pour manipuler les éléments HTML dynamiques (ce système appartient également à 3DO). Lors de la découverte des premières capacités Ajax , digiGroups, Noosh et d'autres ont utilisé des cadres pour transmettre des informations dans le champ visuel des navigateurs des utilisateurs sans actualiser le contexte visuel d'une application Web, réalisant des applications Web riches en temps réel en utilisant uniquement les capacités standard HTTP, HTML et JavaScript de Netscape 4.0.5+ et IE 5+.

Crockford a d'abord spécifié et popularisé le format JSON. Les cofondateurs de State Software ont convenu de créer un système utilisant les capacités de navigateur standard et fournissant une couche d'abstraction permettant aux développeurs Web de créer des applications Web avec état dotées d'une connexion duplex persistante à un serveur Web en maintenant deux connexions HTTP ( Hypertext Transfer Protocol ) ouvertes. et les recycler avant les délais d'expiration standard du navigateur si aucune autre donnée n'a été échangée. Les co-fondateurs ont eu une table ronde et ont voté s'il fallait appeler le format de données JSML (JavaScript Markup Language) ou JSON (JavaScript Object Notation), ainsi que sous quel type de licence le rendre disponible. Chip Morningstar a développé l'idée du State Application Framework chez State Software.

Le système a été vendu à Sun Microsystems , Amazon.com et EDS . Le site Web JSON.org a été lancé en 2002. En décembre 2005, Yahoo! a commencé à offrir certains de ses services Web en JSON.

JSON était basé sur un sous - ensemble du langage de script JavaScript (en particulier, la norme ECMA -262 3e édition—décembre 1999) et est couramment utilisé avec JavaScript, mais il s'agit d'un format de données indépendant du langage . Le code d' analyse et de génération de données JSON est facilement disponible dans de nombreux langages de programmation . Le site Web de JSON répertorie les bibliothèques JSON par langue.

En octobre 2013, Ecma International a publié la première édition de sa norme JSON ECMA-404. La même année, la RFC  7158 utilisait l'ECMA-404 comme référence. En 2014, la RFC  7159 est devenue la principale référence pour les usages Internet de JSON, remplaçant la RFC  4627 et la RFC  7158 (mais en conservant ECMA-262 et ECMA-404 comme références principales). En novembre 2017, ISO/IEC JTC 1/SC 22 a publié ISO/IEC 21778:2017 en tant que norme internationale. Le 13 décembre 2017, l' Internet Engineering Task Force a rendu obsolète la RFC  7159 en publiant la RFC  8259 , qui est la version actuelle de la norme Internet STD 90.

Crockford a ajouté une clause à la licence JSON stipulant que « Le logiciel doit être utilisé pour le bien, pas pour le mal », afin d' ouvrir les bibliothèques JSON tout en se moquant des avocats d'entreprise et de ceux qui sont trop pédants. D'autre part, cette clause a conduit à des problèmes de compatibilité de licence de la licence JSON avec d'autres licences open source , car les logiciels open source et les logiciels libres n'impliquent généralement aucune restriction sur le but d'utilisation.

Syntaxe

L'exemple suivant montre une représentation JSON possible décrivant une personne.

{
  "firstName": "John",
  "lastName": "Smith",
  "isAlive": true,
  "age": 27,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "office",
      "number": "646 555-4567"
    }
  ],
  "children": [],
  "spouse": null
}

Encodage de caractère

Bien que Crockford ait initialement affirmé et cru que JSON est un sous-ensemble strict de JavaScript et ECMAScript, sa spécification autorise en fait des documents JSON valides qui ne sont pas du JavaScript valide ; JSON permet aux terminaisons de ligne Unicode U+2028 LINE SEPARATOR et U+2029 PARAGRAPH SEPARATOR d'apparaître sans échappement dans les chaînes entre guillemets, contrairement à ECMAScript 2018 et versions antérieures. C'est une conséquence du fait que JSON n'autorise que les "caractères de contrôle". Pour une portabilité maximale, ces caractères doivent être protégés par une barre oblique inverse.

L'échange JSON dans un écosystème ouvert doit être encodé en UTF-8 . L'encodage prend en charge le jeu de caractères Unicode complet, y compris les caractères en dehors du plan multilingue de base (U+10000 à U+10FFFF). Cependant, s'ils sont échappés, ces caractères doivent être écrits à l'aide de paires de substitution UTF-16 . Par exemple, pour inclure le caractère Emoji U+1F610 VISAGE NEUTRE dans JSON :

{ "face": "😐" }
// or
{ "face": "\uD83D\uDE10" }

JSON est devenu un sous-ensemble strict d'ECMAScript à partir de la révision 2019 du langage.

Types de données

Les types de données de base de JSON sont :

  • Nombre : un nombre décimal signé qui peut contenir une partie fractionnaire et peut utiliser la notation exponentielle E , mais ne peut pas inclure des non-nombres tels que NaN . Le format ne fait aucune distinction entre entier et virgule flottante. JavaScript utilise un format à virgule flottante double précision pour toutes ses valeurs numériques (jusqu'à ce que plus tard, il prenne également en charge BigInt ), mais d'autres langages implémentant JSON peuvent coder les nombres différemment.
  • Chaîne : une séquence de zéro ou plusieurs caractères Unicode . Les chaînes sont délimitées par des guillemets doubles et prennent en charge une syntaxe d' échappement à barre oblique inverse .
  • Booléen : l'une des valeurs trueoufalse
  • Tableau : une liste ordonnée de zéro ou plusieurs éléments, chacun pouvant être de n'importe quel type. Les tableaux utilisent la notation entre crochets avec des éléments séparés par des virgules.
  • Objet : une collection de paires nom-valeur où les noms (également appelés clés) sont des chaînes. Les objets sont destinés à représenter des tableaux associatifs , où chaque clé est unique au sein d'un objet. Les objets sont délimités par des accolades et utilisent des virgules pour séparer chaque paire, tandis que dans chaque paire, le caractère deux-points ':' sépare la clé ou le nom de sa valeur.
  • null: une valeur vide, en utilisant le mot null

Les espaces blancs sont autorisés et ignorés autour ou entre les éléments syntaxiques (valeurs et ponctuation, mais pas dans une valeur de chaîne). Quatre caractères spécifiques sont considérées comme des espaces à cet effet: l' espace , onglet horizontal , saut de ligne et retour chariot . En particulier, la marque d'ordre des octets ne doit pas être générée par une implémentation conforme (bien qu'elle puisse être acceptée lors de l'analyse JSON). JSON ne fournit pas de syntaxe pour les commentaires .

Les premières versions de JSON (telles que spécifiées par la RFC  4627 ) exigeaient qu'un texte JSON valide ne soit constitué que d'un objet ou d'un type de tableau, pouvant contenir d'autres types. Cette restriction a été supprimée dans la RFC  7158 , où un texte JSON a été redéfini comme n'importe quelle valeur sérialisée.

Les nombres en JSON sont agnostiques en ce qui concerne leur représentation dans les langages de programmation. Bien que cela permette de sérialiser des nombres de précision arbitraire , cela peut entraîner des problèmes de portabilité. Par exemple, étant donné qu'aucune différenciation n'est faite entre les valeurs entières et à virgule flottante, certaines implémentations peuvent traiter 42, 42.0, et 4.2E+1comme le même nombre, tandis que d'autres ne le peuvent pas. La norme JSON n'impose aucune exigence concernant les détails d'implémentation tels que le débordement , le débordement insuffisant , la perte de précision, l'arrondi ou les zéros signés , mais il recommande de ne pas s'attendre à plus que la précision IEEE 754 binary64 pour une « bonne interopérabilité ». Il n'y a pas de perte de précision inhérente à la sérialisation d'une représentation binaire au niveau de la machine d'un nombre à virgule flottante (comme binary64) en une représentation décimale lisible par l'homme (comme les nombres en JSON), et inversement, car il existe des algorithmes publiés pour le faire exactement et de manière optimale.

Les commentaires ont été intentionnellement exclus de JSON. En 2012, Douglas Crockford a décrit sa décision de conception ainsi : « J'ai supprimé les commentaires de JSON parce que j'ai vu que des gens les utilisaient pour contenir des directives d'analyse, une pratique qui aurait détruit l'interopérabilité. »

JSON interdit les " virgules de fin ", une virgule après la dernière valeur dans une structure de données. Les virgules de fin sont une caractéristique commune des dérivés JSON pour améliorer la facilité d'utilisation.

Sémantique

Alors que JSON fournit un cadre syntaxique pour l'échange de données, l'échange de données sans ambiguïté nécessite également un accord entre le producteur et le consommateur sur la sémantique de l'utilisation spécifique de la syntaxe JSON. Un exemple de cas où un tel accord est nécessaire est la sérialisation de types de données définis par la syntaxe JavaScript qui ne font pas partie de la norme JSON, par exemple Date, Fonction, Expression régulière et undefined.

Métadonnées et schéma

Le type MIME officiel pour le texte JSON est " application/json", et la plupart des implémentations modernes l'ont adopté. Le type MIME non officiel " text/json" ou le type de contenu " text/javascript" sont également pris en charge pour des raisons héritées par de nombreux fournisseurs de services, navigateurs, serveurs, applications Web, bibliothèques, frameworks et API. Des exemples notables incluent l'API de recherche Google, Yahoo!, Flickr, l'API Facebook, le framework Lift et Dojo Toolkit 0.4.

Le schéma JSON spécifie un format basé sur JSON pour définir la structure des données JSON pour la validation, la documentation et le contrôle des interactions. Il fournit un contrat pour les données JSON requises par une application donnée, et comment ces données peuvent être modifiées. JSON Schema est basé sur les concepts de XML Schema (XSD), mais est basé sur JSON. Comme dans XSD, les mêmes outils de sérialisation/désérialisation peuvent être utilisés à la fois pour le schéma et les données, et ils sont auto-descriptifs. Il est spécifié dans un projet Internet à l'IETF, actuellement dans le projet 2020-12, qui a été publié le 28 janvier 2021. Il existe plusieurs validateurs disponibles pour différents langages de programmation, chacun avec différents niveaux de conformité. Il n'y a pas d'extension de nom de fichier standard.

La norme JSON ne prend pas en charge les références d' objets , mais il existe un projet de norme IETF pour les références d'objets basées sur JSON. La boîte à outils Dojo prend en charge les références d'objets à l'aide de JSON standard ; Plus précisément, le dojox.json.refmodule prend en charge plusieurs formes de référencement, notamment le référencement circulaire , multiple, inter-message et paresseux . En interne, les deux le font en attribuant une "$ref"clé pour de telles références et en la résolvant au moment de l'analyse ; le brouillon de l'IETF ne spécifie que la syntaxe de l'URL, mais Dojo en permet plus. Alternativement, des solutions non standard existent telles que l'utilisation de Mozilla JavaScript Sharp Variables. Cependant, cette fonctionnalité est devenue obsolète avec JavaScript 1.8.5 et a été supprimée dans Firefox version 12.

Les usages

JSON-RPC est un protocole d' appel de procédure à distance (RPC) basé sur JSON, en remplacement de XML-RPC ou SOAP . Il s'agit d'un protocole simple qui ne définit qu'une poignée de types de données et de commandes. JSON-RPC permet à un système d'envoyer des notifications (informations au serveur qui ne nécessitent pas de réponse) et plusieurs appels au serveur qui peuvent être répondus dans le désordre.

JavaScript et JSON asynchrones (ou AJAJ) font référence à la même méthodologie de page Web dynamique qu'Ajax , mais au lieu de XML , JSON est le format de données. AJAJ est une technique de développement Web qui permet à une page Web de demander de nouvelles données après son chargement dans le navigateur Web . En règle générale, il restitue les nouvelles données du serveur en réponse aux actions de l'utilisateur sur cette page Web. Par exemple, ce que l'utilisateur tape dans une zone de recherche , le code côté client l' envoie ensuite au serveur, qui répond immédiatement avec une liste déroulante d' éléments de base de données correspondants .

Bien que JSON soit un format de sérialisation de données, il a connu une utilisation ad hoc en tant que langage de configuration . Dans ce cas d'utilisation, la prise en charge des commentaires et d'autres fonctionnalités a été jugée utile, ce qui a conduit à la création de plusieurs surensembles JSON non standard . Parmi eux se trouvent HJSON, HOCON et JSON5 (qui, malgré son nom, n'est pas la cinquième version de JSON). L'objectif principal de la version 1.2 de YAML était de faire du format non standard un sur-ensemble JSON strict.

En 2012, Douglas Crockford a dit ceci à propos des commentaires en JSON lorsqu'ils sont utilisés comme langage de configuration : « Je sais que le manque de commentaires rend certaines personnes tristes, mais cela ne devrait pas. Supposons que vous utilisiez JSON pour conserver les fichiers de configuration, ce qui que vous souhaitez annoter. Allez-y et insérez tous les commentaires que vous aimez. Puis transférez-les via JSMin avant de les transmettre à votre analyseur JSON. "

JSON est conçu comme un format de sérialisation de données . Cependant, sa conception en tant que sous-ensemble de JavaScript peut conduire à l'idée fausse qu'il est sûr de transmettre des textes JSON à la fonction JavaScript . Ce n'est pas sûr, en raison de certains textes JSON valides, en particulier ceux contenant U+2028 LINE SEPARATOR ou U+2029 PARAGRAPH SEPARATOR , n'étant pas du code JavaScript valide avant la mise à jour des spécifications JavaScript en 2019, et donc les moteurs plus anciens peuvent ne pas le prendre en charge. Pour éviter les nombreux pièges causés par l'exécution de code arbitraire à partir d'Internet, une nouvelle fonction a d'abord été ajoutée à la cinquième édition d'ECMAScript, qui, à partir de 2017, est prise en charge par tous les principaux navigateurs. Pour les navigateurs non pris en charge, une bibliothèque JavaScript compatible avec l'API est fournie par Douglas Crockford . De plus, la proposition TC39 "Subsume JSON" a fait d' ECMAScript un sur-ensemble JSON strict à partir de la révision 2019 du langage. eval() JSON.parse()

Diverses implémentations d'analyseur JSON ont souffert d' attaques par déni de service et d' une vulnérabilité d'affectation de masse .

Comparaison avec d'autres formats

JSON est présenté comme une alternative peu coûteuse à XML, car ces deux formats prennent largement en charge la création, la lecture et le décodage dans les situations réelles où ils sont couramment utilisés. Outre XML, les exemples pourraient inclure CSV et YAML (un sur-ensemble de JSON). De plus, Google Protocol Buffers peut remplir ce rôle, bien qu'il ne s'agisse pas d'un langage d'échange de données.

YAML

YAML version 1.2 est un sur-ensemble de JSON ; les versions antérieures n'étaient pas strictement compatibles. Par exemple, l'échappement d'une barre oblique /avec une barre oblique inverse \est valide en JSON, mais n'était pas valide en YAML. YAML prend en charge les commentaires, contrairement à JSON.

XML

XML a été utilisé pour décrire des données structurées et pour sérialiser des objets. Divers protocoles basés sur XML existent pour représenter le même type de structures de données que JSON pour le même type d'échange de données. Les données peuvent être encodées en XML de plusieurs manières. La forme la plus étendue utilisant des paires de balises donne une représentation beaucoup plus grande que JSON, mais si les données sont stockées dans des attributs et une forme de "balise courte" où la balise de fermeture est remplacée par />, la représentation est souvent de la même taille que JSON ou juste un peu plus grand. Cependant, un attribut XML ne peut avoir qu'une seule valeur et chaque attribut ne peut apparaître qu'une seule fois sur chaque élément.

XML sépare les "données" des "métadonnées" (via l'utilisation d'éléments et d'attributs), alors que JSON n'a pas un tel concept.

Une autre différence clé est l'adressage des valeurs. JSON a des objets avec un simple mappage "clé" à "valeur", alors qu'en XML, l'adressage se produit sur des "nœuds", qui reçoivent tous un identifiant unique via le processeur XML. De plus, la norme XML définit un attribut commun xml:id, qui peut être utilisé par l'utilisateur, pour définir explicitement un ID.

Les noms de balise XML ne peuvent contenir aucun des caractères !"#$%&'()*+,/;<=>?@[\]^`{|}~, ni un espace, et ne peuvent pas commencer par -, ., ou un chiffre numérique, contrairement aux clés JSON (même si les guillemets et la barre oblique inverse doivent être échappés).

Les valeurs XML sont des chaînes de caractères , sans sécurité de type intégrée . XML a le concept de schema , qui permet un typage fort, des types définis par l'utilisateur, des balises prédéfinies et une structure formelle, permettant la validation formelle d'un flux XML. JSON a un typage puissant intégré et a un concept de schéma similaire dans JSON Schema .

XML prend en charge les commentaires, contrairement à JSON.

Dérivés

Plusieurs formats de sérialisation ont été construits sur ou à partir de la spécification JSON. Les exemples incluent GeoJSON , JSON-LD , Smile (format d'échange de données) , UBJSON , JSON-RPC , JsonML et JSON→URL .

Voir également

Les références

Liens externes