CodeGym /Kursy /Python SELF PL /Praca z JSON za pomocą json

Praca z JSON za pomocą json

Python SELF PL
Poziom 23 , Lekcja 1
Dostępny

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śli True, to pomija klucze, które nie są łańcuchami, liczbami lub None.
  • ensure_ascii: Jeśli True, 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śli True, 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)
    
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION