Adloun

Le format JSON sert à échanger des données entre programmes et entre…

Exercice supplémentaire · niveau 3 (difficile) · NSI (première), chapitre 5 — Les dictionnaires · Aux frontières du programme

Énoncé

Le format JSON sert à échanger des données entre programmes et entre langages. Faire l'aller-retour json.dumps / json.loads sur un enregistrement, puis sur un dictionnaire à clés entières, puis sur un plateau à clés couples. Deux surprises attendent.

Corrigé


import json

photo = {"largeur": 4032, "iso": 200, "appareil": "Pixel"}
assert json.loads(json.dumps(photo)) == photo       # aller-retour fidele

Première surprise : les clés entières deviennent des chaînes.


entiers = {1: "un", 2: "deux"}
retour = json.loads(json.dumps(entiers))
assert retour == {"1": "un", "2": "deux"}
assert retour != entiers            # l'aller-retour a CHANGE les cles

En JSON, une clé est une chaîne — le format n'a pas d'autre choix. L'aller-retour n'est donc pas l'identité : il l'est pour les valeurs, pas pour les clés. Un programme qui enregistre ses données puis les relit retrouve un dictionnaire différent de celui qu'il avait écrit, et l'égalité qu'il testait ailleurs devient fausse.

Seconde surprise : un couple ne peut pas être une clé JSON.


try:
    json.dumps({(0, 0): "X"})
    assert False, "un tuple en cle aurait du echouer"
except TypeError:
    pass

Le plateau de morpion de l'exercice de TD, parfaitement légitime en Python, n'est pas sérialisable tel quel. Il faut convertir les clés — par exemple en "0,0" — et les reconvertir à la lecture. Une structure de données n'est pas toujours transportable telle quelle : ce qu'un langage permet, un format d'échange peut l'interdire.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.