Files
org-roamings/20220604110059-json.org
2022-06-04 12:57:39 +02:00

2.8 KiB
Raw Blame History

Json

Introduction

*J*avaScript *O*bject *N*otation :

  • Est un format de données textuelles dérivé de la notation des objets du langage JavaScript,
  • Permet de représenter de linformation structurée,
  • A été créé par Douglas Crockford entre 2002 et 2005,
  • Première norme est ECMA-404, publiée en octobre 20032,
  • Actuellement décrit par les deux normes en concurrence : RFC 82593 de lIETF et ECMA-4044 de l'ECMA, denière version publiée en décembre 2017.

Spécifications

Un document JSON comprend :

  • 2 types composés :

    • Objet ou dictionnaire (clés/valeurs),
    • Liste ordonnées de valeurs,
  • 4 types scalaires :

    • Booléen : true ou false,
    • Nombre : décimal signé (pas de distinction entre entier et flottant),
    • Chaîne de caractères : séquence de 0 ou plusieurs caractères Unicode entourée de guillemets,
    • La valeur null : une valeur vide.

Extensions de JSON

JSON5

Destiné à contourner les limitation de JSON :

  • Les noms des champs ne sont plus entre guillemets,
  • Ajout des commentaires (sur une ou plusieurs lignes),
  • Support du format hexadécimal pour les nombres,
  • Les nombres peuvent prendre les valeurs Infinity ou NaN,
  • Espaces blancs supplémentaires autorisés,
  • Les string peuvent être contenus entre apostrophes.

HJSON

Destiné à contourner les limitation de JSON :

  • Les champs peuvent être séparés par un retour à la ligne au lieu d'une virgule,
  • Ajout des commentaires (sur une ou plusieurs lignes),
  • Utilisation des guillemets pour encapsuler une string n'est pas obligatoire,
  • Les string peuvent être écrites sur plusieurs lignes.

Description d'une stucture de données JSON (JSPEC)

JSPEC est un language décrivant une structure de données JSON (équivalent à xsd pour le xml). Les fichiers de descripion JSPEC ont l'extension *.jspec.

Python

Le module jspec :

# pip install jspect
from jspec import loads, check

spec = loads('{"name": string, "age": int, ... }')

chris = {"name": "Chris", "age": 26, "status": "online"}
bob = {"name": "Bob", "age": 34.5}

print(f'{check(spec, chris) = }')
print(f'{check(spec, bob) = }')
check(spec, chris) = (True, '')
check(spec, bob) = (False, 'At location $ - exhausted JSON object, failed to match the following JSPEC pairs: ["age": int, ...]')