2.1 Moduł json
JSON (JavaScript Object Notation) to lekki format wymiany danych, który jest łatwo czytelny i zapisany przez człowieka, a także łatwo analizowany i generowany przez komputer. JSON jest często używany do przesyłania danych między serwerem a aplikacją internetową, a także do przechowywania konfiguracji i ustawień.
Moduł json
w Pythonie zapewnia funkcje do serializacji (przekształcania obiektów Pythona w łańcuchy JSON) i deserializacji (przekształcania łańcuchów JSON w obiekty Pythona). Ten moduł jest wbudowany w standardową bibliotekę Pythona i jest aktywnie używany do pracy z danymi JSON.
Podstawowe funkcje modułu json
bardzo przypominają te u pickle
i działają podobnie. A czego oczekujecie — standard!
- Praca z łańcuchami:
-
json.dumps(obj)
— Przekształca obiekt Pythona w łańcuch JSON. -
json.loads(s)
— Przekształca łańcuch JSON w obiekt Pythona.
-
- Praca z plikami:
-
json.dump(obj, file)
— Serializuje obiekt Pythona i zapisuje go w pliku tekstowym. -
json.load(file)
— Deserializuje obiekt Pythona z pliku tekstowego zawierającego dane w formacie JSON.
-
Pozwólcie, że przeanalizujemy kilka przykładów, aby lepiej zapamiętać działanie tych funkcji.
2.2 Serializacja do łańcucha
Serializacja obiektów Pythona do łańcuchów JSON
Aby zserializować obiekt do łańcucha, wystarczy przekazać go do funkcji json.dumps()
.
import json
# Przykład obiektu do serializacji
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
# Przekształcenie obiektu Pythona w łańcuch JSON
json_string = json.dumps(data, indent=4)
print("Zserializowane dane (JSON):", json_string)
Deserializacja łańcuchów JSON do obiektów Pythona
Aby uzyskać obiekt z łańcucha, wystarczy przekazać łańcuch JSON, zawierający opis obiektu, do metody json.loads()
.
import json
# Przykład łańcucha JSON do deserializacji
json_string = ''' { "name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"], "address": { "city": "New York", "zip_code": "10001" } } '''
# Przekształcenie łańcucha JSON w obiekt Pythona
data = json.loads(json_string)
print("Deserializowane dane (Python):", data)
2.3 Serializacja do pliku
Zapis obiektów Pythona do pliku w formacie JSON
Aby zapisać obiekt do pliku, należy wywołać metodę json.dump()
. Przy pracy z plikami ważne jest stosowanie obsługi wyjątków, aby poprawnie obsługiwać możliwe błędy. Oto przykład:
import json
# Przykład obiektu do serializacji
data = {
"name": "Bob",
"age": 25,
"is_student": True,
"courses": ["History", "Literature"],
"address": {
"city": "Los Angeles",
"zip_code": "90001"
}
}
# Zapis obiektu Pythona do pliku JSON z obsługą wyjątków
try:
with open('data.json', 'w') as file:
json.dump(data, file, indent=4)
print("Dane zostały pomyślnie zapisane do pliku.")
except IOError:
print("Błąd przy zapisie do pliku.")
except json.JSONEncodeError:
print("Błąd przy kodowaniu JSON.")
Odczyt obiektów Pythona z pliku w formacie JSON
Odczyt jest również bardzo prosty — wystarczy przekazać plik do metody json.load()
. Tutaj również ważne jest stosowanie obsługi wyjątków:
import json
# Odczyt obiektu Pythona z pliku JSON z obsługą wyjątków
try:
with open('data.json', 'r') as file:
data = json.load(file)
print("Deserializowane dane z pliku (Python):", data)
except IOError:
print("Błąd przy odczycie pliku.")
except json.JSONDecodeError:
print("Błąd przy dekodowaniu JSON.")
2.4 Dodatkowe parametry funkcji
Do funkcji, która zajmuje się serializacją, można przekazać dodatkowe parametry, które sprawią, że Twój JSON będzie ładniejszy:
-
skipkeys
: JeśliTrue
, to pomija klucze, które nie są łańcuchami, liczbami lubNone
. -
ensure_ascii
: JeśliTrue
, wszystkie nie-ASCII znaki będą zamienione na Unicode escape sequences. -
indent
: Jeśli podana jest liczba, wcięcia będą dodane dla lepszej czytelności. -
sort_keys
: JeśliTrue
, klucze w JSON będą posortowane alfabetycznie.
Przykład użycia parametrów json.dumps()
:
import json
data = {"c": 3, "b": 2, "a": 1}
# Serializacja z sortowaniem kluczy i wcięciami
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
2.5 Niestandardowe dekodery i kodery
Moduł json
pozwala na użycie niestandardowych funkcji do serializacji i deserializacji obiektów.
Przykład niestandardowego kodera
Najpierw tworzymy specjalną klasę-koder, która w swoim wnętrzu sprawdza, że jeśli typ obiektu == datetime, to zwraca obiekt jako łańcuch formatu ISO
.
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime): return obj.isoformat()
return super().default(obj)
data = {
"name": "Alice",
"timestamp": datetime.now()
}
# Serializacja z niestandardowym koderem
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)
Przykład niestandardowego dekodera
Do operacji odwrotnej potrzebna jest również funkcja, która przekształca łańcuch w datę. Na przykład, można po prostu sprawdzić nazwę pola, i jeśli nazywa się ono timestamp, to przekształcić łańcuch w obiekt datetime
:
import json
from datetime import datetime
def custom_decoder(dct):
if 'timestamp' in dct: dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
return dct
json_string = '''
{
"name": "Alice",
"timestamp": "2023-05-15T14:30:00"
}
'''
# Deserializacja z niestandardowym dekoderem
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
GO TO FULL VERSION