:PROPERTIES:
:ID:       6c59d844-1f1a-440c-be78-4a9df286fab6
:mtime:    20220604114243
:ctime:    20220604110059
:END:
#+title: 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 l’information 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 l’IETF 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 /[[https://github.com/chrismalcolm/jspec][jspec]]/ :
#+BEGIN_SRC python  :results output
# 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) = }')
#+END_SRC

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

* Références
 * [[https://medium.com/@chrismalcolm_35838/the-best-json-validation-library-for-python-in-2022-b6de4f8014d4][The best json validation library for python in 2022 - Medium]]
 * [[https://fr.wikipedia.org/wiki/JavaScript_Object_Notation][Javascript Object Notation - Wikipedia]]
