Python • kurs podstawowy • lekcja 27
JSON
Lista zadań ma opisy i informację o wykonaniu.
Twój cel: Zapiszesz zagnieżdżone dane do JSON i odtworzysz je jako obiekty Pythona.Listy, słowniki i operacje na plikach.
Od potrzeby do kodu
JSON to tekstowy format danych, który może przechowywać listy, obiekty z nazwanymi polami, napisy, liczby, wartości logiczne i null. Nie jest kodem Pythona.
Serializacja zamienia dane na reprezentację tekstową, a deserializacja odtwarza dane z tekstu. json.dump zapisuje do otwartego pliku, json.load czyta z pliku. dump nie zwraca odtworzonego słownika. Dla tekstu w zmiennej służą dumps i loads; końcowe s oznacza tu pracę z napisem.
W JSON napisy i nazwy pól mają podwójne cudzysłowy, a True, False i None z Pythona odpowiadają true, false i null. ensure_ascii=False pozostawia polskie znaki czytelne, indent=2 dodaje wcięcia. Nie każdy obiekt Pythona nadaje się bezpośrednio do JSON: set nie jest obsługiwany, a krotka po zapisie i odczycie staje się listą. Korzystaj z tekstowych kluczy słowników.
Przewidź przed uruchomieniem
import json
profile = {"name": "Ola", "active": True, "score": None}
with open("profile.json", "w", encoding="utf-8") as file:
json.dump(profile, file, ensure_ascii=False, indent=2)
with open("profile.json", encoding="utf-8") as file:
loaded = json.load(file)
print(loaded["active"])
print(loaded["score"])
loaded["score"] = 8
print(profile["score"])
Porównaj wynik i prześledź mechanizm
True, None i None. load tworzy odtworzone dane. Zmiana loaded nie zmienia profile i nie zapisuje automatycznie pliku; potrzebne jest kolejne dump.
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
True
None
None
| Python | JSON | Po load |
|---|---|---|
| True | true | True |
| None | null | None |
| Lista | Tablica JSON | Lista |
| Słownik z kluczami str | Obiekt JSON | Słownik |
Zmień działający program
Odczytaj profile.json, zmień score na 8 i zapisz dane ponownie. Sprawdź wynik ponownym odczytem.
Pierwsza wskazówka
Zachowaj działający punkt wyjścia. Zlokalizuj konstrukcję wskazaną w poleceniu i zmień tylko ten etap. Przed uruchomieniem zapisz oczekiwany efekt.
Porównaj swoją modyfikację
import json
with open("profile.json", encoding="utf-8") as file:
profile = json.load(file)
profile["score"] = 8
with open("profile.json", "w", encoding="utf-8") as file:
json.dump(profile, file, ensure_ascii=False, indent=2)
with open("profile.json", encoding="utf-8") as file:
print(json.load(file)["score"])
Uruchom po głównym przykładzie, który tworzy potrzebny plik.
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
8
Znajdź przyczynę problemu
Celowo błędny przykład diagnostyczny. Najpierw postaw hipotezę. Nie kopiuj tej wersji jako poprawnego rozwiązania.
Zamierzone działanie: Odczytaj poprawny dokument JSON.
Ręcznie zapisany plik zawiera {"active": True}. json.load zgłasza JSONDecodeError.
Trop do diagnozy
Porównaj zamierzony rezultat z typami, nazwami i kolejnością instrukcji. Wskaż pierwsze miejsce, w którym zachowanie odbiega od celu.
Zastosuj w nowej sytuacji
Wskazówka do rozpoczęcia
JSON zapisuje dane. Zmiana danych w pamięci wymaga osobnego zapisu, aby przetrwała koniec programu.
Zacznij od przygotowania danych. Pierwsza instrukcja przykładowego rozwiązania:
import json
Rozwiązanie do samodzielnej kontroli
import json
tasks = [{"text": "Czytać", "done": False}, {"text": "Spacer", "done": False}]
with open("tasks.json", "w", encoding="utf-8") as file:
json.dump(tasks, file, ensure_ascii=False, indent=2)
with open("tasks.json", encoding="utf-8") as file:
loaded = json.load(file)
for task in loaded:
if not task["done"]:
print(task["text"])
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
Czytać
Spacer
Porównaj dane wejściowe, wynik i powód użycia konstrukcji. Inna wersja kodu jest poprawna, jeśli realizuje te same wymagania.
Co zabierasz do kolejnego programu?
JSON zapisuje dane. Zmiana danych w pamięci wymaga osobnego zapisu, aby przetrwała koniec programu.
Bez zaglądania do przykładu wyjaśnij własnymi słowami, jak główna konstrukcja prowadzi od danych do wyniku. Potem sprawdź wyjaśnienie, uruchamiając swój program.