Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Python

Python JSON: Encoding, Decoding en Bestandsafhandeling – Een Praktische Gids

Wat is JSON in Python?

JSON—kort voor JavaScript Object Notation—is het meest gebruikte tekst-gebaseerde data-uitwisselingsformaat. In Python wijst het direct op native datastructuren: objects worden dicts, arrays worden lists, strings, nummers, booleans en null vertalen naar str, int/float, bool en None respectievelijk. De json module in de standaardbibliotheek behandelt alle conversies.

JSON Bibliotheek in Python

Importeer de module één keer in je script:

import json

De module biedt vier kernmethodes:

MethodeBeschrijving
dumps()Converteer een Python-object naar een JSON-string.
dump()Schrijf een JSON-string direct naar een bestandsobject.
loads()Parse een JSON-string naar een Python-object.
load()Lees en parse een JSON-bestand naar een Python-object.

Python naar JSON (Encoding)

Encoding is het proces van het converteren van Python-datatypen naar JSON. De standaard mapping wordt hieronder getoond:

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

Voorbeeld met 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 met gesorteerde sleutels
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)

Output:

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

Een JSON-object naar een bestand schrijven is eenvoudig met json.dump():

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

Na het draaien van het script bevat json_bestand.json de geserialiseerde data.

JSON naar Python (Decoding)

Decoding keert de mapping om, een JSON-string of bestand terugveranderend in native Python-objecten. De conversietabel spiegelt de encoding-tabel:

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

Voorbeeld met json.loads():

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

Output:

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

Een JSON-bestand direct lezen:

with open('json_bestand.json') as f:
    data = json.load(f)
    print(data)

Output:

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

Compacte en Pretty-Print Encoding

Voor netwerktransmissie verwijdert compacte encoding witruimte:

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

Output:

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

Voor menselijke leesbaarheid gebruikt pretty-printing inspringing:

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

Output:

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

Complexe Objecten Encoderen

De json module kan willekeurige objecten niet serialiseren. Om een complex getal te hanteren, lever je een default functie:

def complex_encode(o):
    if isinstance(o, complex):
        return [o.real, o.imag]
    raise TypeError(f"{repr(o)} is not JSON serializable")
print(json.dumps(4 + 5j, default=complex_encode))

Output:

[4.0, 5.0]

Complexe Objecten Decoderen

Gebruik object_hook om een custom marker te detecteren en het complexe getal te herbouwen:

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)

Output:

(4+5j)

Serialisatie & Deserialisatie Klassen

De JSONEncoder en JSONDecoder klassen bieden fijnmazige controle:

  • JSONEncoder.default(o) – overschrijf om custom objecten te serialiseren.
  • JSONEncoder.encode(o) – retourneer een JSON-string.
  • JSONEncoder.iterencode(o) – itereer over de output-string.
  • JSONDecoder.decode(s) – parse een JSON-string.
  • JSONDecoder.raw_decode(s) – parse beginnend bij een gegeven index.

Voorbeeld:

from json.encoder import JSONEncoder
print(JSONEncoder().encode({"kleur": ["rood", "geel", "groen"]}))

JSON Ophalen van een URL

Met requests een live JSON-feed downloaden (bijv. 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])

Output:

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

JSON Exceptions Afhandelen

De primaire exception is json.JSONDecodeError, een subklasse van ValueError. Voorbeeld afhandeling:

try:
    with open('slecht.json') as f:
        data = json.load(f)
except json.JSONDecodeError as e:
    print(f"Slecht JSON: {e}")

Speciale Numerieke Waarden

RFC 8259 staat Infinity of NaN niet toe, maar de Python encoder vertegenwoordigt ze als strings:

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

Output:

Infinity
NaN

Herhaalde Sleutels in JSON

Wanneer een sleutel meerdere keren voorkomt, houdt Python's json.loads() alleen de laatste occurentie:

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

Command-Line Tools

De json.tool module formatteert en valideert JSON vanaf de command line:

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

Voordelen van JSON in Python

  • Native ondersteuning via de json module.
  • Menselijk leesbaar met pretty-printing.
  • Breed geadopteerd voor API's, configuratie en data-opslag.
  • Taal-onafhankelijk en lichtgewicht.

Beperkingen

  • Ondersteunt geen custom datatypen zonder custom encoder.
  • Maximale recursiediepte beperkt diep geneste structuren.
  • Grote documenten kunnen geheugen-intensief zijn om volledig te laden.

Python JSON Cheat Sheet

FunctieBeschrijving
json.dumps(obj)Serialiseer Python-object naar JSON-string.
json.dump(obj, file)Schrijf JSON-string naar een bestand.
json.dumps(obj, separators=(",", ":"))Compacte representatie zonder spaties.
json.dumps(obj, indent=4)Pretty-printed JSON met inspringing.
json.dumps(obj, sort_keys=True)Sorteer dictionary-sleutels alfabetisch.
json.dumps(obj, default=custom)Encodeer niet-ondersteunde objecten.
JSONEncoder().encode(obj)Handmatige serialisatie via encoder klasse.
json.loads(s)Parse JSON-string naar Python-object.
json.loads(s, object_hook=custom)Custom deserialisatie logica.
JSONDecoder().decode(s)Handmatige deserialisatie via decoder klasse.

Python

  1. Python Datatypes onder de knie krijgen: Een praktische gids
  2. Python Operators onder de knie krijgen: Een uitgebreide gids
  3. Python's While Loop onder de knie krijgen: Syntaxis, Voorbeelden en Best Practices
  4. Python Pass Statement onder de knie krijgen: Een praktische gids
  5. Python Functies onder de knie krijgen: Syntaxis, Types en Praktische Voorbeelden
  6. Python Functie-argumenten onder de knie krijgen: Positionele, Keyword en Default Parameters
  7. Python-dictionaries beheersen: aanmaken, manipuleren en geavanceerde technieken
  8. Python-bestands-I/O: bestandsbewerkingen, lezen, schrijven en beheer beheersen
  9. Bestands- en directory-bestaat controleren in Python – Een praktische gids
  10. Python Bestands I/O: In- en uitvoerbewerkingen onder de knie krijgen
  11. Bestanden Lezen in Java met BufferedReader – Een Praktische Gids met Voorbeelden