Qu'est-ce que JSON et comment l'utiliser ?

Publié: 2022-08-14
Image du texte "JSON" superposé sur un écran d'ordinateur
Maria Vonotna/Shutterstock.com

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 courants. Nous couvrirons également certaines des limitations de JSON et les alternatives qui ont émergé.

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": "Qu'est-ce que JSON ?",
    "auteur": {
        "identifiant": 1,
        "nom": "James Walker"
    },
    "tags": ["api", "json", "programmation"],
    "publié": faux,
    "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 :

  • Chaînes – 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 et false sont prises en charge.
  • Null – La valeur littérale null peut être utilisée pour signifier une valeur vide ou omise.
  • Tableaux - Un tableau est une simple liste indiqué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 convertir manuellement id en 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. Cependant, JSON n'autorise pas une virgule après la dernière entrée - l'inclusion involontaire d'une virgule 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

L'extension .json est normalement utilisée lorsque JSON est enregistré dans un fichier. Le contenu JSON a le type MIME standardisé application/json , bien que text/json soit parfois utilisé pour des raisons de compatibilité. De nos jours, vous devez vous fier à application/json pour les en-têtes HTTP Accept et Content-Type .

La plupart des API qui utilisent JSON encapsulent tout dans un objet de niveau supérieur :

 {
    "erreur": 1000
}

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 :

 1000 
 vrai 
 nul

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, les JSON.stringify() et JSON.parse() sont utilisées pour encoder et décoder les chaînes JSON :

 poste const = {
    identifiant : 1001 ,
    title : "Qu'est-ce que JSON ?" ,
    auteur : {
        identifiant : 1 ,
        nom : "James Walker"
    }
} ;

const encodéJson = JSON. stringifier ( poster ) ;

// {"id": 1001, "title": "Qu'est-ce que JSON ?", ...}
console. log ( encodéJson ) ;

const décodéJson = JSON. analyse ( encodéJson ) ;

// James Walker
console. log ( décodéJson. auteur . nom ) ;

PHP

Les fonctions équivalentes en PHP sont json_encode() et json_decode() :

 $post = [
    "identifiant" => 1001 ,
    "title" => "Qu'est-ce que JSON ?" ,
    "auteur" => [
        "identifiant" => 1 ,
        "nom" => "James Walker"
    ]
] ;

$encodéJson = json_encode ( $post ) ;

// {"id": 1001, "title": "Qu'est-ce que JSON ?", ...}
echo $encodéJson ;

$decodéJson = json_decode ( $encodéJson , true ) ;

// James Walker
echo $decodéJson [ "auteur" ] [ "nom" ] ;

Python

Python fournit json.dumps() et json.loads() pour sérialiser et désérialiser respectivement :

 importer json

poste = {
    "identifiant" : 1001 ,
    "title" : "Qu'est-ce que JSON ?" ,
    "auteur" : {
        "identifiant" : 1 ,
        "nom" : "James Walker"
    }
}

encodéJson = json. décharges ( poste )

# {"id": 1001, "title": "Qu'est-ce que JSON ?", ...}
print ( encodéJson )

décodéJson = json. charges ( encodéJson )

#James Walker
print ( décodéJson [ "auteur" ] [ "nom" ] )

Rubis

Ruby propose JSON.generate et JSON.parse :

 nécessite "json"

poste = {
    "identifiant" => 1001 ,
    "title" => "Qu'est-ce que JSON ?" ,
    "auteur" => {
        "identifiant" => 1 ,
        "nom" => "James Walker"
    }
}

encodéJson = JSON. générer ( poster )

# {"id": 1001, "title": "Qu'est-ce que JSON ?", ...}
met encodéJson

décodéJson = JSON. analyser ( encodéJson )

#James Walker
met décodéJson [ "auteur" ] [ "nom" ]

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.

Sans commentaires

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 d'imposer que 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 :

 {
    "des postes": [
        {
            "id": 1001,
            "title": "Qu'est-ce que JSON ?",
            "auteur": {
                "identifiant": 1,
                "nom": "James Walker"
            }
        },
        {
            "id": 1002,
            "title": "Qu'est-ce que le SaaS ?",
            "auteur": {
                "identifiant": 1,
                "nom": "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 :

 {
    "des postes": [
        {
            "id": 1001,
            "title": "Qu'est-ce que JSON ?",
            "author": "{{ .authors.james }}"
        },
        {
            "id": 1002,
            "title": "Qu'est-ce que le SaaS ?",
            "author": "{{ .authors.james }}"
        }
    ],
    "auteurs": {
        "James": {
            "identifiant": 1,
            "nom": "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 sous forme de chaînes, comme 2022-07-01T12:00:00+00:00 , mais qu'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é.