Qu’est-ce que JSON et comment l’utiliser ?
JSON (JavaScript Object Notation) est un format standardisé de représentation de données structurées. Bien que JSON soit né du langage de programmation JavaScript, il s’agit désormais d’une méthode omniprésente d’échange de données entre les systèmes. La plupart des API modernes acceptent les requêtes JSON et émettent des réponses JSON. Il est donc utile d’avoir une bonne connaissance pratique du format et de ses fonctionnalités.
Dans cet article, nous expliquerons ce qu’est JSON, comment il exprime différents types de données et comment vous pouvez le produire et le consommer dans les langages de programmation populaires. Nous couvrirons également certaines des limitations de JSON et les alternatives qui ont émergé.
Sommaire
Principes de base de JSON
JSON a été initialement conçu par Douglas Crockford comme un format sans état pour la communication de données entre les navigateurs et les serveurs. Au début des années 2000, les sites Web commençaient à récupérer de manière asynchrone des données supplémentaires sur leur serveur, après le chargement initial de la page. En tant que format textuel dérivé de JavaScript, JSON a simplifié la récupération et la consommation de données dans ces applications. La spécification a finalement été normalisée sous le nom ECMA-404 en 2013.
JSON est toujours transmis sous forme de chaîne. Ces chaînes peuvent être décodées en une gamme de types de données de base, notamment des nombres, des booléens, des tableaux et des objets. Cela signifie que les hiérarchies d’objets et les relations peuvent être préservées pendant la transmission, puis réassemblées à la réception d’une manière adaptée à l’environnement de programmation.
Un exemple JSON de base
Ceci est une représentation JSON d’un article de blog :
{ "id": 1001, "title": "What is JSON?", "author": { "id": 1, "name": "James Walker" }, "tags": ["api", "json", "programming"], "published": false, "publishedTimestamp": null }
Cet exemple illustre tous les types de données JSON. Il illustre également la concision des données au format JSON, l’une des caractéristiques qui les rend si attrayantes pour une utilisation dans les API. De plus, JSON est relativement facile à lire tel quel, contrairement aux formats plus verbeux tels que XML.
Types de données JSON
Six types de données peuvent être représentées nativement en JSON :
- Cordes – Les chaînes sont écrites entre guillemets doubles ; les caractères peuvent être échappés à l’aide de barres obliques inverses.
- Nombres – Les nombres sont écrits sous forme de chiffres sans guillemets. Vous pouvez inclure un composant fractionnaire pour désigner un flottant. La plupart des implémentations d’analyse JSON supposent un nombre entier lorsqu’il n’y a pas de point décimal présent.
- Booléens – Les valeurs littérales
true
etfalse
sont pris en charge. - Nul – La
null
une valeur littérale peut être utilisée pour signifier une valeur vide ou omise. - Tableaux – Un tableau est une simple liste dénotée par des crochets. Chaque élément de la liste est séparé par une virgule. Les tableaux peuvent contenir n’importe quel nombre d’éléments et ils peuvent utiliser tous les types de données pris en charge.
- Objets – Les objets sont créés par des accolades. Il s’agit d’une collection de paires clé-valeur où les clés sont des chaînes, entourées de guillemets doubles. Chaque clé a une valeur qui peut prendre n’importe lequel des types de données disponibles. Vous pouvez imbriquer des objets pour créer des hiérarchies en cascade. Une virgule doit suivre chaque valeur, signifiant la fin de cette paire clé-valeur.
Les analyseurs JSON convertissent automatiquement ces types de données en structures adaptées à leur langage. Vous n’avez pas besoin de caster manuellement id
à un entier, par exemple. L’analyse de l’intégralité de la chaîne JSON est suffisante pour mapper les valeurs à leur format de données d’origine.
Sémantique et Validation
JSON a certaines règles qui doivent être respectées lorsque vous encodez vos données. Les chaînes qui ne respectent pas la syntaxe ne seront pas analysables par les consommateurs.
Il est particulièrement important de prêter attention aux guillemets autour des chaînes et des clés d’objet. Vous devez également vous assurer qu’une virgule est utilisée après chaque entrée dans un objet ou un tableau. JSON n’a pas autoriser une virgule de fin après la dernière entrée cependant – en inclure involontairement une est une cause fréquente d’erreurs de validation. La plupart des éditeurs de texte mettront en évidence les problèmes de syntaxe pour vous, aidant à découvrir les erreurs.
Malgré ces points de déclenchement communs, JSON est l’un des formats de données les plus faciles à écrire à la main. La plupart des gens trouvent la syntaxe rapide et pratique une fois qu’ils s’y sont familiarisés. Dans l’ensemble, JSON a tendance à être moins sujet aux erreurs que XML, où des balises d’ouverture et de fermeture incompatibles, des déclarations de schéma non valides et des problèmes d’encodage de caractères causent souvent des problèmes.
Désignation du contenu JSON
La .json
L’extension est normalement utilisée lorsque JSON est enregistré dans un fichier. Le contenu JSON a le type MIME standardisé application/json
même si text/json
est parfois utilisé pour des raisons de compatibilité. De nos jours, vous devriez compter sur application/json
pour Accept
et Content-Type
En-têtes HTTP.
La plupart des API qui utilisent JSON encapsulent tout dans un objet de niveau supérieur :
Ce n’est cependant pas obligatoire – un type littéral est valide en tant que nœud de niveau supérieur dans un fichier, donc les exemples suivants sont également tous valides JSON :
Ils décoderont leurs scalaires respectifs dans votre langage de programmation.
Travailler avec JSON
La plupart des langages de programmation ont un support JSON intégré. Voici comment interagir avec les données JSON dans quelques environnements populaires.
Javascript
En JavaScript, le JSON.stringify()
et JSON.parse()
méthodes sont utilisées pour encoder et décoder les chaînes JSON :
const post = { id: 1001, title: "What Is JSON?", author: { id: 1, name: "James Walker" } }; const encodedJson = JSON.stringify(post); // {"id": 1001, "title": "What Is JSON?", ...} console.log(encodedJson); const decodedJson = JSON.parse(encodedJson); // James Walker console.log(decodedJson.author.name);
PHP
Les fonctions équivalentes en PHP sont json_encode()
et json_decode()
:
$post = [ "id" => 1001, "title" => "What Is JSON?", "author" => [ "id" => 1, "name" => "James Walker" ] ]; $encodedJson = json_encode($post); // {"id": 1001, "title": "What Is JSON?", ...} echo $encodedJson; $decodedJson = json_decode($encodedJson, true); // James Walker echo $decodedJson["author"]["name"];
Python
Python fournit json.dumps()
et json.loads()
pour sérialiser et désérialiser respectivement :
import json post = { "id": 1001, "title": "What Is JSON?", "author": { "id": 1, "name": "James Walker" } } encodedJson = json.dumps(post) # {"id": 1001, "title": "What Is JSON?", ...} print(encodedJson) decodedJson = json.loads(encodedJson) # James Walker print(decodedJson["author"]["name"])
Rubis
Offres rubis JSON.generate
et JSON.parse
:
require "json" post = { "id" => 1001, "title" => "What Is JSON?", "author" => { "id" => 1, "name" => "James Walker" } } encodedJson = JSON.generate(post) # {"id": 1001, "title": "What Is JSON?", ...} puts encodedJson decodedJson = JSON.parse(encodedJson) # James Walker puts decodedJson["author"]["name"]
Limites JSON
JSON est un format léger qui se concentre sur la transmission des valeurs au sein de votre structure de données. Cela le rend rapide à analyser et facile à utiliser, mais cela signifie qu’il y a des inconvénients qui peuvent causer de la frustration. Voici quelques-uns des plus gros problèmes.
Les données JSON ne peuvent pas inclure de commentaires. Le manque d’annotations réduit la clarté et vous oblige à mettre la documentation ailleurs. Cela peut rendre JSON inadapté à des situations telles que les fichiers de configuration, où les modifications sont peu fréquentes et les objectifs des champs peuvent ne pas être clairs.
Aucun schéma
JSON ne vous permet pas de définir un schéma pour vos données. Il n’y a aucun moyen de faire respecter cela id
est un champ entier obligatoire, par exemple. Cela peut conduire à des structures de données involontairement malformées.
Aucune référence
Les champs ne peuvent pas référencer d’autres valeurs dans la structure de données. Cela provoque souvent des répétitions qui augmentent la taille du fichier. En revenant à l’exemple d’article de blog précédent, vous pourriez avoir une liste d’articles de blog comme suit :
{ "posts": [ { "id": 1001, "title": "What is JSON?", "author": { "id": 1, "name": "James Walker" } }, { "id": 1002, "title": "What is SaaS?", "author": { "id": 1, "name": "James Walker" } } ] }
Les deux messages ont le même auteur mais les informations associées à cet objet ont dû être dupliquées. Dans un monde idéal, les implémentations d’analyseurs JSON seraient capables de produire la structure illustrée ci-dessus à partir d’entrées similaires à ce qui suit :
{ "posts": [ { "id": 1001, "title": "What is JSON?", "author": "{{ .authors.james }}" }, { "id": 1002, "title": "What is SaaS?", "author": "{{ .authors.james }}" } ], "authors": { "james": { "id": 1, "name": "James Walker" } } }
Ce n’est actuellement pas possible avec le JSON standard.
Aucun type de données avancé
Les six types de données pris en charge omettent de nombreux types de valeurs courants. JSON ne peut pas stocker nativement les dates, les heures ou les points de géolocalisation, vous devez donc décider de votre propre format pour ces informations.
Cela provoque des écarts gênants et des cas extrêmes. Si votre application gère les horodatages comme des chaînes, comme 2022-07-01T12:00:00+00:00
mais une API externe présente le temps en secondes après l’époque Unix – 1657287000
– vous devrez vous rappeler quand utiliser chacun des formats.
Alternatives JSON
YAML est la principale alternative JSON. C’est un sur-ensemble du format qui a une présentation plus lisible par l’homme, des types de données personnalisés et une prise en charge des références. Il est destiné à résoudre la plupart des problèmes d’utilisabilité associés à JSON.
YAML a été largement adopté pour les fichiers de configuration et dans les outils DevOps, IaC et d’observabilité. Il est moins fréquemment utilisé comme format d’échange de données pour les API. La complexité relative de YAML signifie qu’il est moins accessible aux nouveaux arrivants. De petites erreurs de syntaxe peuvent entraîner des échecs d’analyse déroutants.
Les tampons de protocole (protobufs) sont un autre concurrent JSON émergent conçu pour sérialiser les données structurées. Les protobufs ont des déclarations de type de données, des champs obligatoires et la prise en charge de la plupart des principaux langages de programmation. Le système gagne en popularité en tant que moyen plus efficace de transmettre des données sur les réseaux.
Sommaire
JSON est un format de représentation de données basé sur du texte qui peut coder six types de données différents. JSON est devenu un incontournable de l’écosystème de développement logiciel ; il est pris en charge par tous les principaux langages de programmation et est devenu le choix par défaut pour la plupart des API REST développées au cours des deux dernières décennies.
Bien que la simplicité de JSON fasse partie de sa popularité, elle impose également des limites sur ce que vous pouvez réaliser avec le format. Le manque de prise en charge des schémas, des commentaires, des références d’objets et des types de données personnalisés signifie que certaines applications trouveront qu’elles dépassent ce qui est possible avec JSON. Des alternatives plus récentes telles que YAML et Protobuf ont aidé à relever ces défis, tandis que XML reste un concurrent pour les applications qui souhaitent définir un schéma de données et ne se soucient pas de la verbosité.