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