Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Python

Python JSON: Encoding, Decoding und Datei-Handling – Ein praktischer Leitfaden

Python JSON: Encoding, Decoding und Datei-Handling – Ein praktischer Leitfaden

Was ist JSON in Python?

JSON – kurz für JavaScript Object Notation – ist das am weitesten verbreitete textbasierte Datenaustauschformat. In Python ordnet es sich direkt nativen Datenstrukturen zu: Objekte werden zu dicts, Arrays zu lists, Strings, Zahlen, Booleans und null übersetzen sich zu str, int/float, bool und None. Das json-Modul in der Standardbibliothek handhabt alle Konvertierungen.

JSON-Bibliothek in Python

Importieren Sie das Modul einmal in Ihrem Skript:

import json

Das Modul bietet vier Kernmethoden:

MethodeBeschreibung
dumps()Konvertiert ein Python-Objekt in einen JSON-String.
dump()Schreibt einen JSON-String direkt in ein Dateiobjekt.
loads()Parst einen JSON-String in ein Python-Objekt.
load()Liest und parst eine JSON-Datei in ein Python-Objekt.

Python zu JSON (Encoding)

Encoding ist der Prozess der Konvertierung von Python-Datentypen in JSON. Das Standard-Mapping ist unten gezeigt:

PythonJSON
dictObject
listArray
str/unicodeString
int/longNumber (int)
floatNumber (real)
Truetrue
Falsefalse
Nonenull

Beispiel mit 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}
    ]
}

# Pretty-Print mit sortierten Keys
sortierter_string = json.dumps(x, indent=4, sort_keys=True)
print(sortierter_string)

Ausgabe:

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

Einen JSON-Objekt in eine Datei zu schreiben ist mit json.dump() unkompliziert:

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

Nach Ausführung des Skripts enthält json_datei.json die serialisierten Daten.

JSON zu Python (Decoding)

Decoding kehrt das Mapping um und wandelt einen JSON-String oder eine Datei zurück in native Python-Objekte. Die Konvertierungstabelle spiegelt die Encoding-Tabelle wider:

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

Beispiel mit json.loads():

import json

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

Ausgabe:

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

JSON-Datei direkt lesen:

with open('json_datei.json') as f:
    daten = json.load(f)
    print(daten)

Ausgabe:

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

Kompaktes und Pretty-Print Encoding

Für Netzwerkübertragung entfernt kompaktes Encoding Whitespace:

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

Ausgabe:

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

Für menschliche Lesbarkeit nutzt Pretty-Printing Einrückung:

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

Ausgabe:

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

Komplexe Objekte encodieren

json-Modul kann keine beliebigen Objekte serialisieren. Um eine complex-Zahl zu handhaben, liefern Sie eine default-Funktion:

def complex_encode(o):
    if isinstance(o, complex):
        return [o.real, o.imag]
    raise TypeError(f"{repr(o)} ist nicht JSON-serialisierbar")

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

Ausgabe:

[4.0, 5.0]

Komplexe Objekte decodieren

Verwenden Sie object_hook, um einen benutzerdefinierten Marker zu erkennen und die komplexe Zahl wiederherzustellen:

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

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

Ausgabe:

(4+5j)

Serialisierungs- & Deserialisierungs-Klassen

Die JSONEncoder und JSONDecoder Klassen bieten feinkörnige Kontrolle:

  • JSONEncoder.default(o) – überschreiben, um benutzerdefinierte Objekte zu serialisieren.
  • JSONEncoder.encode(o) – gibt einen JSON-String zurück.
  • JSONEncoder.iterencode(o) – iteriert über den Ausgabestring.
  • JSONDecoder.decode(s) – parst einen JSON-String.
  • JSONDecoder.raw_decode(s) – parst ab einem gegebenen Index.

Beispiel:

from json.encoder import JSONEncoder
print(JSONEncoder().encode({"farbe": ["rot", "gelb", "grün"]}))

JSON von einer URL abrufen

Verwenden Sie requests, um einen Live-JSON-Feed herunterzuladen (z. B. CityBike NYC):

import json, requests

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

Ausgabe:

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

JSON-Exceptions behandeln

Die primäre Exception ist json.JSONDecodeError, eine Subklasse von ValueError. Beispiel-Handling:

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

Spezielle numerische Werte

RFC 8259 erlaubt keine Infinity oder NaN, aber der Python-Encoder repräsentiert sie als Strings:

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

Ausgabe:

Infinity
NaN

Wiederholte Keys in JSON

Wenn ein Key mehrfach vorkommt, behält Pythons json.loads() nur das letzte Vorkommen:

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

Kommandozeilen-Tools

Das json.tool-Modul formatiert und validiert JSON von der Kommandozeile:

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

Vorteile von JSON in Python

  • Native Unterstützung via json-Modul.
  • Menschenlesbar mit Pretty-Printing.
  • Weit verbreitet für APIs, Konfiguration und Datenspeicherung.
  • Sprachenunabhängig und leichtgewichtig.

Einschränkungen

  • Unterstützt keine benutzerdefinierten Datentypen ohne custom encoder.
  • Maximale Rekursionstiefe begrenzt tief verschachtelte Strukturen.
  • Große Dokumente können speicherintensiv sein, um vollständig zu laden.

Python JSON Cheat Sheet

FunktionBeschreibung
json.dumps(obj)Python-Objekt in JSON-String serialisieren.
json.dump(obj, datei)JSON-String in Datei schreiben.
json.dumps(obj, separators=(",", ":"))Kompakte Darstellung ohne Leerzeichen.
json.dumps(obj, indent=4)Pretty-printed JSON mit Einrückung.
json.dumps(obj, sort_keys=True)Dictionary-Keys alphabetisch sortieren.
json.dumps(obj, default=custom)Nicht unterstützte Objekte encodieren.
JSONEncoder().encode(obj)Manuelle Serialisierung via Encoder-Klasse.
json.loads(s)JSON-String in Python-Objekt parsen.
json.loads(s, object_hook=custom)Benutzerdefinierte Deserialisierungslogik.
JSONDecoder().decode(s)Manuelle Deserialisierung via Decoder-Klasse.

Python

  1. Python-Datentypen meistern: Praxisleitfaden
  2. Python-Operatoren meistern: Umfassender Leitfaden
  3. Pythons While-Schleife meistern: Syntax, Beispiele & Best Practices
  4. Python pass-Statement meistern: Praxisleitfaden
  5. Python-Funktionsargumente meistern: Positional, Keyword & Default-Parameter
  6. Python-Dictionaries meistern: Erstellung, Manipulation und fortgeschrittene Techniken
  7. Python File I/O: Dateioperationen, Lesen, Schreiben und Verwaltung meistern
  8. Dateien in Java mit BufferedReader lesen – Praktischer Leitfaden mit Beispielen
  9. Datei- und Verzeichnisexistenz in Python prüfen – Ein praktischer Leitfaden
  10. Python Datei-E/A: Eingabe- und Ausgabeoperationen meistern