Przewodnik po parsowaniu JSON w Python

Komentarze: 0

JSON to skrót od JavaScript Object Notation. Jest nie tylko lekki, ale także łatwy do czytania i pisania dla ludzi. Podobnie, maszyny uważają go za łatwy do analizowania i generowania. Parsowanie JSON jest niezwykle ważne podczas pracy z danymi z interfejsów API, plików konfiguracyjnych lub innych źródeł przechowywanych informacji dla każdego programisty Pythona. Ten artykuł przeprowadzi Cię przez podstawowe procedury parsowania JSON przy użyciu modułu JSON Pythona.

Zrozumienie JSON i jego struktury

JSON reprezentuje dane jako pary klucz-wartość, podobnie jak słownik Pythona. Oto podstawowy przykład obiektu JSON:

{
    "name": "Alice",
    "age": 30,
    "is_student": false,
    "courses": ["Math", "Science"]
}

Ten obiekt JSON zawiera ciąg znaków, liczbę, wartość logiczną i tablicę. Zrozumienie tej struktury ma fundamentalne znaczenie dla analizowania i manipulowania danymi JSON w Pythonie.

Praca z JSON w Pythonie

Moduł json Pythona ułatwia analizowanie ciągów i plików JSON. Moduł ten zawiera metody takie jak json.loads() do odczytu JSON z ciągu znaków oraz json.load() do odczytu JSON z pliku. I odwrotnie, json.dumps() i json.dump() służą do zapisywania JSON odpowiednio do łańcucha i pliku.

Odczytywanie danych JSON

Istnieje kilka sposobów odczytu danych JSON, którym przyjrzymy się w następnej kolejności.

Odczytywanie JSON z ciągu znaków

Aby odczytać dane JSON z ciągu znaków, należy użyć metody json.loads():

import json

json_string = '{"name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"]}'
data = json.loads(json_string)

print(data)

Wyjście:

1.png

Odczytywanie JSON z pliku

Aby odczytać dane JSON z pliku, należy użyć metody json.load():

import json

with open('data.json', 'r') as file:
    data = json.load(file)

print(data)

Wyjście:

2.png

Zapisywanie danych JSON

Oto kilka różnych sposobów zapisu danych JSON:

Zapisywanie JSON do łańcucha znaków

Aby zapisać dane JSON do łańcucha, użyj metody json.dumps():

import json

data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"]
}

json_string = json.dumps(data)
print(json_string)

Wyjście:

3.png

Zapisywanie JSON do pliku

Aby zapisać dane JSON do pliku, użyj metody json.dump():

import json

data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"]
}

with open('data.json', 'w') as file:
    json.dump(data, file)

Obsługa zagnieżdżonego JSON

Zagnieżdżone obiekty JSON są powszechne podczas pracy z bardziej złożonymi strukturami danych. Python może z łatwością obsługiwać te zagnieżdżone struktury.

import json

nested_json_string = '''
{
    "name": "Alice",
    "age": 30,
    "is_student": false,
    "courses": ["Math", "Science"],
    "address": {
        "street": "123 Main St",
        "city": "Wonderland"
    }
}
'''

data = json.loads(nested_json_string)
print(data['address']['city'])

Wyjście:

4.png

Niestandardowy koder JSON

Czasami trzeba przekonwertować niestandardowe obiekty Pythona na JSON. Wymaga to niestandardowego kodera.

import json

class Student:
    def __init__(self, name, age, is_student):
        self.name = name
        self.age = age
        self.is_student = is_student

class StudentEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Student):
            return obj.__dict__
        return super().default(obj)

student = Student("Alice", 30, False)
json_string = json.dumps(student, cls=StudentEncoder)
print(json_string)

Wyjście:

5.png

Niestandardowy dekoder JSON

Podobnie, aby zdekodować dane JSON do niestandardowych obiektów Pythona, potrzebny jest niestandardowy dekoder.

import json

class Student:
    def __init__(self, name, age, is_student):
        self.name = name
        self.age = age
        self.is_student = is_student

def student_decoder(dct):
    return Student(dct['name'], dct['age'], dct['is_student'])

json_string = '{"name": "Alice", "age": 30, "is_student": false}'
student = json.loads(json_string, object_hook=student_decoder)
print(student.name)

Wyjście:

6.png

Rozwiązywanie typowych problemów

Praca z danymi JSON może prowadzić do kilku typowych błędów, szczególnie podczas analizowania, generowania lub uzyskiwania dostępu do danych JSON. Oto niektóre z najczęstszych z nich:

Nieprawidłowy format JSON

Częstym błędem podczas parsowania JSON jest napotkanie nieprawidłowego formatu JSON. JSON wymaga podwójnych cudzysłowów wokół kluczy i wartości łańcuchowych oraz prawidłowego zagnieżdżenia nawiasów i nawiasów klamrowych.

import json

invalid_json_string = "{'name': 'Alice', 'age': 30, 'is_student': False}"
try:
    data = json.loads(invalid_json_string)
except json.JSONDecodeError as e:
    print(f"Invalid JSON format: {e}")

Wyjście:

7.png

Obsługa brakujących kluczy

Podczas analizowania danych JSON można napotkać brakujące klucze. Użyj metody get, aby podać wartość domyślną, jeśli brakuje klucza.

import json

json_string = '{"name": "Alice", "age": 30}'
data = json.loads(json_string)

is_student = data.get('is_student', False)
print(is_student)import json

json_string = '{"name": "Alice", "age": 30}'
data = json.loads(json_string)

is_student = data.get('is_student', False)
print(is_student)

Debugowanie błędów parsowania JSON

Użyj modułu pdb, aby ustawić punkty przerwania i debugować kod parsowania JSON.

import json
import pdb

json_string = '{"name": "Alice", "age": 30, "is_student": false}'
pdb.set_trace()
data = json.loads(json_string)
print(data)

Praktyczny przykład obsługi JSON w web scrapingu

Web scraping często obejmuje wyodrębnianie danych z internetowych interfejsów API, które zwracają odpowiedzi JSON. Oto kompaktowy przykład wykorzystujący bibliotekę requests i punkt końcowy https://httpbin.org/anything.

Najpierw upewnij się, że masz zainstalowaną bibliotekę requests:

pip install requests

Ten kod importuje żądania dla żądań HTTP i json do obsługi danych JSON. Wysyła żądanie GET do docelowego adresu URL za pomocą requests.get(url) i analizuje odpowiedź JSON za pomocą response.json(), przekształcając ją w słownik Pythona. Wyciągamy i drukujemy określone dane, takie jak nagłówki, agent użytkownika, pochodzenie i adres URL.

Kod zawiera silną obsługę błędów; przechwytuje json.JSONDecodeError, gdy wystąpi błąd dekodowania JSON, oraz KeyError, gdy określony klucz jest nieobecny, co w konsekwencji zabezpiecza program przed awariami "braku danych". Taka solidność kodu pozwala zatem doskonale radzić sobie z rzeczywistymi zadaniami skrobania stron internetowych.

import requests
import json

url = 'https://httpbin.org/anything'

response = requests.get(url)

try:
    data = response.json()

    # Wyodrębnianie określonych danych z odpowiedzi JSON
    headers = data['headers']
    user_agent = headers.get('User-Agent', 'N/A')
    origin = data.get('origin', 'N/A')
    url = data.get('url', 'N/A')

    print(f"User Agent: {user_agent}")
    print(f"Origin: {origin}")
    print(f"URL: {url}")

except json.JSONDecodeError:
    print("Error decoding JSON response")

except KeyError as e:
    print(f"Key error: {e} not found in the JSON response")

8.png

Każdy programista Pythona musi wiedzieć, jak analizować JSON. Dzięki modułowi JSON i najlepszemu sposobowi jego wykonania, który został przedstawiony w tym podręczniku, będziesz w stanie odczytywać, zapisywać i debugować dane JSON wystarczająco szybko. Oznacza to, że będziesz regularnie testować swoje kody i korzystać z odpowiednich narzędzi i najbardziej aktualnych funkcji dostępnych w Pythonie, aby uzyskać lepsze umiejętności obsługi JSON.

Podczas przeprowadzania web scrapingu, parsowanie JSON jest bardzo ważne, biorąc pod uwagę fakt, że dane pobierane z internetowych interfejsów API zwykle pojawiają się w formie JSON. Poza tym, możesz skutecznie wydobywać informacje z różnych źródeł internetowych, jeśli potrafisz parsować i manipulować danymi JSON w dobry sposób.

Komentarze:

0 komentarze