2.28. JSON

JSON (JavaScript Object Notation) est un format texte compact et lisible par l’humain pour des données structurées. Il définit six types – chaîne, nombre, booléen, null, tableau et objet – dont chacun correspond directement à une valeur Python, de sorte que la conversion entre Python et JSON tient en un seul appel de fonction dans les deux sens.

JSON est la lingua franca des fichiers de configuration et des API web. Recourez-y dès que vous devez enregistrer un petit ensemble de paramètres sur disque sous une forme également lisible à l’œil, ou échanger des données structurées avec un autre programme.

Deux fonctions couvrent la plupart des besoins :

  • json.dumps()dump string : transforme une valeur Python en une chaîne JSON.

  • json.loads()load string : analyse une chaîne JSON pour la reconvertir en Python.

Le couple json.dump / json.load (sans s) fait le même travail mais prend directement un objet fichier.

2.28.1. Encodage (dumps)

import json

config = {
    "name":  "OpenMV",
    "width": 320,
    "tags":  ["red", "round"],
}

text = json.dumps(config)
print(text)

Sortie

{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}

La correspondance est :

Tout ce qui sort de cet ensemble (une classe personnalisée, un tampon bytes, un set) lève une TypeError. Convertissez d’abord la valeur.

Note

La fonction json.dumps() de CPython accepte un argument indent pour une sortie joliment formatée ; ce n’est pas le cas de celle de MicroPython. Le seul réglage de mise en forme est separators, qui contrôle l’espacement en ligne – passez (',', ':') pour la forme la plus compacte. Une sortie indentée sur plusieurs lignes doit, au besoin, être produite à la main.

2.28.2. Décodage (loads)

text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])

Sortie

OpenMV 320

Les objets JSON deviennent des dict, les tableaux deviennent des list, et le reste se reconvertit vers ses équivalents Python. Un JSON incorrect lève une ValueError.

2.28.3. Lecture et écriture de fichiers

Le couple basé sur les fichiers se marie bien avec with :

import json

with open("config.json") as f:
    config = json.load(f)

config["width"] = 640

with open("config.json", "w") as f:
    json.dump(config, f)

Considérez le fichier JSON comme un enregistrement complet – lisez-le, modifiez la valeur Python, puis réécrivez-la. Tenter de modifier du JSON sur place à l’intérieur d’un fichier crée généralement plus de bugs qu’il n’en évite.