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.
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 sortedZ JSON do Pythona: loads
json.loads(string) analizuje ciąg znaków JSON i zwraca obiekty Pythona.
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"] # 'Ada'
type(d) # <class 'dict'>Mapowanie typów
| JSON | Python |
|---|---|
object | dict |
array | list |
string | str |
number | int / float |
true | True |
false | False |
null | None |
Z pliku: dump / load
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:
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializableMożesz przekazać funkcję default, która wskazuje, jak je przekształcić:
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:
with open("data.json", "w") as f:
json.dump(data, f)Spróbuj sam
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`.
Pokaż wskazówkę
json.dumps(data, indent=2)
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
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.
Pokaż wskazówkę
json.loads zwraca listę słowników.
Rozwiązanie dostępne po 3 próbach
Dodatkowe wyzwanie
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`.
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