Preview Mode

You're viewing this material in preview mode. Sign up to track your progress and access all features.

JSON
In Progress

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
JSON zapisuje dane. Zmiana danych w pamięci wymaga osobnego zapisu, aby przetrwała koniec programu.
JSON zapisuje dane. Zmiana danych w pamięci wymaga osobnego zapisu, aby przetrwała koniec programu.

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
Model do prześledzenia: porównaj każdy etap z kodem. Etykiety opisują znaczenie danych, nie tylko ich wygląd.

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.