Przejdź do głównej treści
eLearner.app
Moduł 8 · Lekcja 1 z 429/36 w kursie~10 min
Lekcje modułu (1/4)

JSON: serializacja i parsowanie

JSON to najpopularniejszy format wymiany danych. Moduł json z biblioteki standardowej obsługuje go natywnie.

Z Pythona do JSON: dumps

json.dumps(object) serializuje obiekt Pythona do postaci ciągu znaków JSON.

Python
import json

dati = {"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}
json.dumps(dati)
# '{"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}'

json.dumps(dati, indent=2, sort_keys=True)
# multi-line formatted string, keys sorted

Z JSON do Pythona: loads

json.loads(string) analizuje ciąg znaków JSON i zwraca obiekty Pythona.

Python
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"]    # 'Ada'
type(d)      # <class 'dict'>

Mapowanie typów

JSONPython
objectdict
arraylist
stringstr
numberint / float
trueTrue
falseFalse
nullNone

Z pliku: dump / load

Python
with open("config.json", "w") as f:
    json.dump(dati, f, indent=2)

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

Bez końcowej litery „s” funkcje te operują na plikach, natomiast z literą „s” — na ciągach znaków.

Typy nieserializowalne: default

Obiekty datetime, set oraz Twoje własne klasy nie są domyślnie serializowalne:

Python
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable

Możesz przekazać funkcję default, która wskazuje, jak je przekształcić:

Python
def converti(obj):
    if isinstance(obj, datetime.datetime):
        return obj.isoformat()
    if isinstance(obj, set):
        return list(obj)
    raise TypeError(f"non serializzabile: {type(obj)}")

json.dumps({"ora": datetime.datetime.now()}, default=converti)

JSON i operacje na plikach

Biblioteka standardowa udostępnia również funkcje json.dump() oraz json.load() (bez litery „s”) do zapisu i odczytu danych JSON bezpośrednio do i z plików, co naturalnie łączy się z użyciem menedżerów kontekstu:

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

Spróbuj sam

Ćwiczenie#python.m8.l1.e1
Próby: 0Ładowanie...

Dla słownika `data = {'nome': 'Ada', 'anni': 36}`, zserializuj go do formatu JSON z wcięciem indent=2 i przypisz do zmiennej `json_str`. Oceń `json_str`.

Ładowanie edytora...
Pokaż wskazówkę

json.dumps(data, indent=2)

Rozwiązanie dostępne po 3 próbach

Ćwiczenie powtórzeniowe

Ćwiczenie#python.m8.l1.e2
Próby: 0Ładowanie...

Dla podanego ciągu JSON s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]', sparsuj go za pomocą json.loads do zmiennej data i oblicz sumę wartości 'v' w zmiennej total. Oceń total.

Ładowanie edytora...
Pokaż wskazówkę

json.loads zwraca listę słowników.

Rozwiązanie dostępne po 3 próbach

Dodatkowe wyzwanie

Ćwiczenie#python.m8.l1.e3
Próby: 0Ładowanie...

Dla podanego ciągu JSON `json_data = '{"name": "Alice", "age": 30}'`, zdekoduj go do słownika Pythona za pomocą `json.loads`. Wyciągnij wartość powiązaną z kluczem `'name'` i zapisz ją w zmiennej `user_name`. Na koniec oceń `user_name`.

Ładowanie edytora...
Pokaż wskazówkę

Użyj json.loads(json_data) do zdekodowania, a następnie uzyskaj dostęp poprzez data['name'].

Rozwiązanie dostępne po 3 próbach