Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Python

Python JSON : encodage, décodage et gestion de fichiers – Guide pratique

Python JSON : encodage, décodage et gestion de fichiers – Guide pratique

Qu'est-ce que JSON en Python ?

JSON — abréviation de JavaScript Object Notation — est le format d'échange de données textuel le plus utilisé. En Python, il correspond directement aux structures de données natives : les objets deviennent des dict, les tableaux deviennent des list, les chaînes, nombres, booléens et null traduisent en str, int/float, bool et None respectivement. Le module json de la bibliothèque standard gère toutes les conversions.

Bibliothèque JSON en Python

Importez le module une fois dans votre script :

import json

Le module offre quatre méthodes principales :

MéthodeDescription
dumps()Convertir un objet Python en chaîne JSON.
dump()Écrire une chaîne JSON directement dans un objet fichier.
loads()Analyser une chaîne JSON en objet Python.
load()Lire et analyser un fichier JSON en objet Python.

Python vers JSON (Encodage)

L'encodage est le processus de conversion des types de données Python en JSON. Le mappage par défaut est montré ci-dessous :

PythonJSON
dictObject
listArray
strString
intNumber (int)
floatNumber (real)
Truetrue
Falsefalse
Nonenull

Exemple utilisant json.dumps() :

import json

x = {
    "name": "Ken",
    "age": 45,
    "married": True,
    "children": ("Alice", "Bob"),
    "pets": ["Dog"],
    "cars": [
        {"model": "Audi A1", "mpg": 15.1},
        {"model": "Zeep Compass", "mpg": 18.1}
    ]
}

# Jolie impression avec clés triées
chaine_triee = json.dumps(x, indent=4, sort_keys=True)
print(chaine_triee)

Sortie :

{
    "age": 45,
    "cars": [
        { "model": "Audi A1", "mpg": 15.1 },
        { "model": "Zeep Compass", "mpg": 18.1 }
    ],
    "children": [ "Alice", "Bob" ],
    "married": true,
    "name": "Ken",
    "pets": [ "Dog" ]
}

Écrire un objet JSON dans un fichier est simple avec json.dump() :

with open('json_file.json', 'w') as fichier_ecriture:
    json.dump(x, fichier_ecriture, indent=4, sort_keys=True)

Après exécution du script, json_file.json contiendra les données sérialisées.

JSON vers Python (Décodage)

Le décodage inverse le mappage, transformant une chaîne ou fichier JSON en objets Python natifs. La table de conversion miroir la table d'encodage :

JSONPython
Objectdict
Arraylist
Stringstr
Number (int)int
Number (real)float
trueTrue
falseFalse
nullNone

Exemple utilisant json.loads() :

import json

donnees_personne = '{"person": {"name": "Kenn", "sex": "male", "age": 28}}'
obj = json.loads(donnees_personne)
print(obj)
print(type(obj))
print(obj.get('person'))

Sortie :

{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
<class 'dict'>
{'name': 'Kenn', 'sex': 'male', 'age': 28}

Lire un fichier JSON directement :

with open('json_file.json') as f:
    donnees = json.load(f)
    print(donnees)

Sortie :

{'name': 'Ken', 'age': 45, ...}

Encodage compact et joli

Pour la transmission réseau, l'encodage compact supprime les espaces :

lst = ['a', 'b', 'c', {"4": 5, "6": 7}]
compact = json.dumps(lst, separators=(',', ':'))
print(compact)

Sortie :

["a","b","c",{"4":5,"6":7}]

Pour la lisibilité humaine, le joli affichage utilise l'indentation :

dic = {"a": 4, "b": 5}
joli = json.dumps(dic, indent=4, separators=(',', ': '))
print(joli)

Sortie :

{
    "a": 4,
    "b": 5
}

Encodage d'objets complexes

Le module json ne peut pas sérialiser d'objets arbitraires. Pour gérer un nombre complex, fournissez une fonction default :

def encoder_complexe(o):
    if isinstance(o, complex):
        return [o.real, o.imag]
    raise TypeError(f"{repr(o)} n'est pas sérialisable en JSON")

print(json.dumps(4 + 5j, default=encoder_complexe))

Sortie :

[4.0, 5.0]

Décodage d'objets complexes

Utilisez object_hook pour détecter un marqueur personnalisé et reconstruire le nombre complexe :

def est_complexe(obj):
    if "__complex__" in obj:
        return complex(obj["real"], obj["img"])
    return obj

objet_complexe = json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook=est_complexe)
print(objet_complexe)

Sortie :

(4+5j)

Classes de sérialisation et désérialisation

Les classes JSONEncoder et JSONDecoder fournissent un contrôle fin :

Exemple :

from json.encoder import JSONEncoder
print(JSONEncoder().encode({"couleur": ["rouge", "jaune", "vert"]}))

Récupérer du JSON depuis une URL

Utiliser requests pour télécharger un flux JSON en direct (ex. : CityBike NYC) :

import json, requests

reponse = requests.get("https://feeds.citibikenyc.com/stations/stations.json")
velo_dict = json.loads(reponse.text)
print(velo_dict['stationBeanList'][0])

Sortie :

{'id': 487, 'stationName': 'E 20 St & FDR Drive', 'availableDocks': 24, ...}

Gestion des exceptions JSON

L'exception principale est json.JSONDecodeError, une sous-classe de ValueError. Exemple de gestion :

try:
    with open('bad.json') as f:
        donnees = json.load(f)
except json.JSONDecodeError as e:
    print(f"JSON invalide : {e}")

Valeurs numériques spéciales

RFC 8259 n'autorise pas Infinity ou NaN, mais l'encodeur Python les représente comme chaînes :

print(json.dumps(float('inf')))
print(json.dumps(float('nan')))

Sortie :

Infinity
NaN

Clés répétées en JSON

Quand une clé apparaît plusieurs fois, json.loads() de Python ne garde que la dernière occurrence :

json.loads('{"a": 1, "a": 2, "a": 3}')  # -> {'a': 3}

Outils en ligne de commande

Le module json.tool formate et valide JSON depuis la ligne de commande :

$ echo '{"name": "Kings Arthur"}' | python3 -m json.tool
{
    "name": "Kings Arthur"
}

Avantages de JSON en Python

Limitations

Feuille de triche Python JSON

FonctionDescription
json.dumps(obj)Sérialiser objet Python en chaîne JSON.
json.dump(obj, fichier)Écrire chaîne JSON dans un fichier.
json.dumps(obj, separators=(",", ":"))Représentation compacte sans espaces.
json.dumps(obj, indent=4)JSON joli avec indentation.
json.dumps(obj, sort_keys=True)Trier clés dictionnaire alphabétiquement.
json.dumps(obj, default=custom)Encoder objets non supportés.
JSONEncoder().encode(obj)Sérialisation manuelle via classe encodeur.
json.loads(s)Analyser chaîne JSON en objet Python.
json.loads(s, object_hook=custom)Logique de désérialisation personnalisée.
JSONDecoder().decode(s)Désérialisation manuelle via classe décodeur.

Python

  1. Maîtriser les types de données Python : Guide pratique
  2. Maîtriser les opérateurs Python : Guide complet
  3. Maîtriser l'instruction pass en Python : Guide pratique
  4. Maîtriser les arguments de fonctions Python : Positionnels, nommés et paramètres par défaut
  5. Maîtriser les dictionnaires Python : création, manipulation et techniques avancées
  6. Entrées/sorties de fichiers Python : maîtriser les opérations sur les fichiers
  7. Lecture de Fichiers en Java avec BufferedReader – Guide Pratique avec Exemples
  8. Vérifier l'existence de fichiers et répertoires en Python – Guide pratique
  9. Entrées/Sorties de fichiers en Python : Maîtriser les opérations de lecture et d'écriture