01 Uči
Memorija nestaje; fajlovi ostaju.
Lista TaskManagera postoji samo dok program radi. JSON je poznat format strukturiranog teksta: json.dump() zapisuje Python liste i rečnike u fajl, dok ih json.load() ponovo čita.
import json
def save_tasks(self, path="data/tasks.json"):
data = {"task_id": task.task_id, "title": task.title, "completed": task.completed}
with open(path, "w", encoding="utf-8") as file:
json.dump([data], file, ensure_ascii=False, indent=2)
JSON ne može direktno da sačuva prilagođeni Task objekat. Sačuvaj rečnik sa task_id, title i completed, a nakon učitavanja napravi novi Task iz tog rečnika.
save_tasks(path="data/tasks.json") i load_tasks(path="data/tasks.json") koriste podrazumevanu putanju u normalnom radu. U testu prosledi posebnu putanju kako test podaci nikada ne bi menjali stvarni data/tasks.json fajl. Uspešno učitavanje zamenjuje self.tasks, umesto da ga dopunjuje, pa ponovljeno učitavanje ne pravi duplikate.
↳Jasna politika rada sa fajlom: Ako izabrana putanja ne postoji, load_tasks() ostavlja trenutnu listu nepromenjenom. Ako JSON nije ispravan, prijavi čitljivu grešku i zadrži trenutnu listu nepromenjenom.
Ponovno pravljenje jednog Task objektasaved = {"task_id": "task-1", "title": "Read", "completed": True}
task = Task(saved["task_id"], saved["title"])
task.completed = saved["completed"]
Rečnik sadrži obične JSON vrednosti. Ponovo napravljen Task je opet objekat sa atributima i metodama.
Čuvaj i učitavaj predvidivo
- Sačuvaj obične podatkePretvori svaki Task u rečnik, zatim upotrebi json.dump() sa encoding="utf-8".
- Učitaj novu listuUčitaj JSON pomoću json.load(), ponovo napravi Task objekte i zameni self.tasks tek nakon uspešnog učitavanja.
Česte greške pri JSON čuvanju podataka
- Pokušaj direktnog čuvanja Task objektajson.dump() prihvata rečnike, liste, stringove, brojeve, logičke vrednosti i null-slične vrednosti, a ne prilagođene objekte.
02 Radi lokalno
Sačuvaj zadatke i nakon završetka programa
Radi ovo u VS Code-u
Nastavi u Task Manager projektu iz koncepata 28 i 29. U ovaj isti projekat ćeš dodati JSON čuvanje podataka, bez pravljenja ili preuzimanja novog projekta.
Tvoj postojeći Task Manager projekattask_manager/
├── main.py
├── models/
│ └── task.py
├── services/
│ └── task_manager.py
└── data/
└── tasks.json
Zadrži Task i TaskManager metode koje si već napravio. Folder data čuvaće JSON fajl koji pravi tvoj program.
Dodaj čuvanje podataka korak po korak
- Otvori postojeći projekatOtvori isti folder projekta u VS Code-u. Najviše ćeš raditi u models/task.py, services/task_manager.py, main.py i folderu data.
- Prepoznaj oblik JSON-aJedan Task objekat postaje jedan rečnik. JSON fajl čuva listu tih rečnika, a ne Python Task objekte.
- Isplaniraj pretvaranje objekataZapiši tri vrednosti koje svaki sačuvani zadatak treba: task_id, title i completed. Zatim odluči kako ćeš napraviti novi Task i vratiti njegovu vrednost completed nakon čitanja rečnika.
task_data = {
"task_id": task.task_id,
"title": task.title,
"completed": task.completed,
}
- Implementiraj save_tasks()U services/task_manager.py uvezi json i dodaj opcioni path parametar sa podrazumevanom vrednošću "data/tasks.json". Pretvori trenutnu listu u obične rečnike, zatim je uz UTF-8 kodiranje zapiši na path. Poziv save_tasks() koristi uobičajeni fajl projekta; test može proslediti posebnu putanju.
def save_tasks(self, path="data/tasks.json"):
with open(path, "w", encoding="utf-8") as file:
json.dump(tasks_data, file, ensure_ascii=False, indent=2)
- Bezbedno implementiraj load_tasks()Daj load_tasks() isti opcioni path parametar. Pročitaj tu putanju, ponovo napravi Task objekte u novoj listi i dodeli self.tasks tek kada čitanje i rekonstrukcija uspeju. Ako izabrani fajl ne postoji, ostavi trenutnu listu nepromenjenom. Ako JSON nije ispravan, prikaži čitljivu grešku i zadrži trenutnu listu.
def load_tasks(self, path="data/tasks.json"):
with open(path, encoding="utf-8") as file:
saved_tasks = json.load(file)
- Pokaži kompletno čuvanje i učitavanjeU main.py dodaj dva zadatka, sačuvaj ih, pregledaj napravljeni JSON fajl, zatim ponovo pokreni program i učitaj sačuvane zadatke pre njihovog prikaza.
python3 main.py
# or: python main.py
Primer JSON fajla[
{"task_id": "task-1", "title": "Read the plan", "completed": false},
{"task_id": "task-2", "title": "Write notes", "completed": true}
]
JSON koristi obične vrednosti. Rečnik opisuje podatke zadatka, a tvoj Python kod ponovo pravi Task objekat nakon učitavanja.
↳Ručna provera: add two tasks → save_tasks() → inspect data/tasks.json → restart → load_tasks() → list_tasks() Nakon ponovnog pokretanja, dva sačuvana zadatka treba da se pojave samo jednom. Odvojeno testiraj fajl koji nedostaje i neispravan JSON, bez gubitka zadataka koji su već u memoriji.
Pre nego što zatražiš pomoć od Slobyja
- Proveri putanju do JSON fajlaPokreni main.py iz foldera projekta kako bi relativna putanja data/tasks.json pokazivala na očekivani folder data.
- Ne čuvaj Task objekte direktnoTypeError znači da je json.dump() dobio Task objekat. Najpre pretvori svaki Task u rečnik.
- Smireno obradi fajl koji nedostajeFileNotFoundError je normalan slučaj pri prvom pokretanju. Jasno ga objasni i ostavi trenutnu listu zadataka nepromenjenom.
- Bezbedno obradi neispravan JSONUhvati JSONDecodeError, prijavi da fajl ne može da se pročita i ne zamenjuj self.tasks delimičnim podacima.
- Izbegni dupliranje zadataka nakon učitavanjaNe dodaj učitane zadatke u self.tasks. Napravi novu listu i zameni self.tasks tek nakon uspešnog učitavanja.