JSON, czyli JavaScript Object Notation, to szeroko stosowany format wymiany danych. Python, w swoim standardowym wyposażeniu, oferuje moduł JSON, który umożliwia sprawne przetwarzanie danych w tym formacie. W tym artykule dogłębnie omówimy zagadnienia związane z wykorzystaniem JSON w Pythonie.
Po lekturze tego tekstu, zdobędziesz wiedzę na temat:
- Podstawowych zasad formatu JSON,
- Sposobów analizowania i generowania ciągów znaków JSON w Pythonie,
- Operacji odczytu i zapisu do plików JSON przy użyciu Pythona.
Zaczynajmy! 🚀
Czym jest JSON?
JSON, czyli JavaScript Object Notation, to oparty na tekście format przeznaczony do wymiany danych. Choć format ten wywodzi się z obiektów JavaScript, obecnie niemal wszystkie języki programowania umożliwiają efektywną pracę z JSON.
Jeśli kiedykolwiek pracowałeś z API lub analizowałeś pliki konfiguracyjne, z dużym prawdopodobieństwem spotkałeś się już z JSON.
📑 JSON jest formatem danych używanym do przesyłania i odbierania informacji podczas interakcji z API. Jest również szeroko stosowany w komunikacji pomiędzy klientem a serwerem w aplikacjach internetowych. Ponadto, JSON może służyć jako uniwersalny format do przechowywania różnorodnych danych.
Struktura JSON przypomina słownik w Pythonie. Słowniki to potężne struktury danych w Pythonie, które przechowują dane w postaci par klucz-wartość.
Zanim przejdziemy dalej, zwróćmy uwagę na kilka kluczowych aspektów:
- W Pythonie obiekty JSON są reprezentowane jako słowniki.
- Tablice JSON są odwzorowywane na listy Pythona.
- Wartości logiczne w JSON (true i false) są odpowiednio przekształcane na wartości logiczne True i False w Pythonie.
Szczegółowe informacje na temat mapowania typów danych pomiędzy JSON a Pythonem można znaleźć w oficjalnej dokumentacji.
Moduł json jest integralną częścią biblioteki standardowej Pythona, więc nie ma potrzeby jego instalowania. Można go zaimportować w następujący sposób:
import json
Jak załadować ciąg JSON w Pythonie?
Ogólna składnia wczytywania ciągu JSON do Pythona wygląda tak:
<dict_obj> = json.loads(<json_str>)
Gdzie:
<dict_obj>
to słownik Pythona, do którego zostanie załadowany ciąg JSON,<json_str>
to dowolny prawidłowy ciąg znaków w formacie JSON.
Powyższy kod spowoduje przekształcenie <json_str>
na słownik Pythona i zapisanie go w <dict_obj>
.
Przeanalizujmy przykład. Niech json_str
będzie ciągiem znaków JSON:
json_str=""' { "books": [ { "title": "The Wind in the Willows", "author": "Kenneth Grahame", "year": "1908" }, { "title": "To the Lighthouse", "author": "Virginia Woolf", "year": "1927" } ] } '''
Poniższy fragment kodu prezentuje, jak przy użyciu metody load()
załadować ciąg JSON json_str
do słownika Pythona. Za pomocą funkcji type()
można zweryfikować, czy py_dict
jest rzeczywiście słownikiem Pythona.
py_dict = json.loads(json_str) type(py_dict) # Output: dict print(py_dict) # Output {'books': [{'title': 'The Wind in the Willows', 'author': 'Kenneth Grahame', 'year': '1908'}, {'title': 'To the Lighthouse', 'author': 'Virginia Woolf', 'year': '1927'}]}
Jak widać powyżej, wszystkie pola z ciągu JSON zostały przekształcone na pary klucz-wartość w słowniku py_dict
.
Jak tworzyć ciągi JSON w Pythonie?
Załóżmy, że dysponujesz słownikiem Pythona. Jak zatem przekształcić go na ciąg JSON?
Można to zrobić za pomocą metody dumps()
o następującej składni:
<json_str> = json.dumps(<dict_obj>)
Gdzie:
<dict_obj>
to słownik Pythona, który ma być przekształcony na ciąg JSON,<json_str>
to wynikowy ciąg znaków w formacie JSON.
Metoda dumps()
dokonuje konwersji słownika <dict_obj>
na ciąg JSON <json_str>
.
Dodajmy nowy klucz „movies” do istniejącego słownika Pythona py_dict
. Można to zrobić w następujący sposób:
py_dict["movies"] = [{"title":"The Imitation Game","year":"2014", "lang":"en","watched":True}]
Teraz, za pomocą metody dumps()
, przekształćmy zmodyfikowany słownik na nowy ciąg JSON json_str2
.
json_str2 = json.dumps(py_dict) print(json_str2) # Output {"books": [{"title": "The Wind in the Willows", "author": "Kenneth Grahame", "year": "1908"}, {"title": "To the Lighthouse", "author": "Virginia Woolf", "year": "1927"}], "movies": [{"title": "The Imitation Game", "year": "2014", "lang": "en", "watched": true}]}
Jak widać, powyższy ciąg JSON jest mało czytelny bez odpowiedniego formatowania. Można użyć opcjonalnego parametru indent
, aby dodać wcięcia.
Ustawiając indent
na liczbę całkowitą, na przykład 2, można uzyskać poniższy efekt:
json_str2 = json.dumps(py_dict, indent = 2) print(json_str2) # Output { "books": [ { "title": "The Wind in the Willows", "author": "Kenneth Grahame", "year": "1908" }, { "title": "To the Lighthouse", "author": "Virginia Woolf", "year": "1927" } ], "movies": [ { "title": "The Imitation Game", "year": "2014", "lang": "en", "watched": true } ] }
Teraz dane wyjściowe są czytelne i łatwe do śledzenia dzięki dodanym wcięciom.
Wskazówka: 💡 Jeśli zależy Ci na posortowaniu kluczy alfabetycznie, możesz ustawić parametr sort_keys
na True
.
Poniższy kod demonstruje, jak klucze zostały posortowane alfabetycznie.
json_str2 = json.dumps(py_dict, indent = 2, sort_keys=True) print(json_str2) # Output { "books": [ { "author": "Kenneth Grahame", "title": "The Wind in the Willows", "year": "1908" }, { "author": "Virginia Woolf", "title": "To the Lighthouse", "year": "1927" } ], "movies": [ { "lang": "en", "title": "The Imitation Game", "watched": true, "year": "2014" } ] }
Klucze są teraz ułożone w porządku alfabetycznym: „author”, „title”, „year”.
Do tej pory omówiliśmy, jak pracować z ciągami JSON w Pythonie. W kolejnej sekcji przyjrzymy się pracy z plikami JSON.
Jak odczytać plik JSON w Pythonie?
Aby odczytać plik JSON w Pythonie, należy użyć następującej składni:
json.load(<json-file>) # gdzie <json-file> to dowolny prawidłowy plik JSON.
Zwróć uwagę, że używamy metody load()
, a nie loads()
. Metoda loads()
służy do wczytywania ciągów JSON, natomiast load()
służy do wczytywania plików JSON.
Podczas pracy z plikami w Pythonie zaleca się używanie menedżerów kontekstu. Możesz oczywiście odczytywać pliki bez ich użycia, w następujący sposób:
my_file = open('students.json','r') contents = my_file.read() print(contents) file.close()
Jeśli zapomnisz zamknąć plik, może dojść do niepotrzebnego zużycia zasobów.
Natomiast w przypadku korzystania z menedżerów kontekstu, pliki są zamykane automatycznie po zakończeniu operacji na nich.
Menedżera kontekstu można użyć do odczytu plików w następujący sposób:
with open('students.json','r') as file: data = json.load(file) print(data) # Output {'students': [{'roll_num': 'cs27', 'name': 'Anna', 'course': 'CS'}, {'roll_num': 'ep30', 'name': 'Kate', 'course': 'PHY'}]}
Podczas odczytu pliku należy określić tryb jako „read”, oznaczany jako 'r’ w powyższym kodzie.
Uwaga: Aby ułatwić nawigację po bieżącym katalogu, upewnij się, że plik JSON znajduje się w tym samym folderze co plik main.py, jak pokazano na poniższym rysunku. Jeśli plik JSON znajduje się w innym folderze, należy podać pełną ścieżkę do pliku.
Poprawnie odczytaliśmy plik JSON w Pythonie.
W kolejnej sekcji omówimy zapisywanie danych do pliku JSON. ✍
Jak zapisywać dane do pliku JSON w Pythonie?
Aby zapisać dane do istniejącego pliku JSON lub utworzyć nowy plik JSON, należy użyć metody dump()
, jak pokazano poniżej:
json.dump(<dict_obj>,<json_file>) # gdzie <dict_obj> to słownik Pythona # a <json_file> to plik JSON
Powyższa składnia powoduje zapisanie słownika <dict_obj>
do pliku JSON <json_file>
.
W poprzedniej sekcji operowaliśmy na słowniku py_dict
. Teraz zapiszmy go do nowego pliku JSON o nazwie „new_file.json”.
Poniższy kod ilustruje, jak można użyć funkcji dump()
:
with open('new_file.json','w') as file: json.dump(py_dict,file)
Uwaga: Otwarcie pliku w trybie zapisu (w) spowoduje nadpisanie jego zawartości, jeśli plik istnieje. Jeśli plik nie istnieje, zostanie on utworzony.
Po wykonaniu powyższego kodu, nowy plik JSON zostanie utworzony w bieżącym katalogu roboczym. Możesz sprawdzić jego zawartość.
Utworzyliśmy plik JSON w Pythonie
Podczas zapisywania danych do pliku, kluczowe jest zachowanie formatowania. Do tego celu, możesz użyć parametrów indent
i sort_keys
.
Podsumowanie
⏲ Czas na krótkie podsumowanie.
W tym artykule dowiedzieliśmy się:
- Jakie są podstawowe zasady formatu JSON,
- Jak używać metod
load()
iloads()
do wczytywania odpowiednio stringów JSON i plików JSON, - Jak wykorzystać metody
dumps()
idump()
do zapisywania słowników Pythona odpowiednio do stringów JSON i plików JSON.
Mam nadzieję, że ten artykuł był dla Ciebie pomocny. Życzę owocnej nauki!
Zachęcam również do zapoznania się z narzędziami online do analizowania, formatowania i weryfikowania plików JSON.
newsblog.pl
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.