Jak analizować JSON w Pythonie

Photo of author

By maciekx

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() i loads() do wczytywania odpowiednio stringów JSON i plików JSON,
  • Jak wykorzystać metody dumps() i dump() 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