Anleitung zum Parsen von JSON in Python

Bemerkungen: 0

JSON steht für JavaScript Object Notation. Sie ist nicht nur leichtgewichtig, sondern auch für Menschen einfach zu lesen und zu schreiben. Auch für Maschinen ist es leicht zu parsen und zu generieren. JSON-Parsing ist für jeden Python-Entwickler extrem wichtig, wenn er mit Daten aus APIs, Konfigurationsdateien oder anderen Quellen gespeicherter Informationen arbeitet. Dieser Artikel führt Sie durch grundlegende Verfahren zum Parsen von JSON mit dem JSON-Modul von Python.

Verständnis von JSON und seiner Struktur

JSON stellt Daten als Schlüssel-Wert-Paare dar, ähnlich wie ein Python-Wörterbuch. Hier ist ein grundlegendes Beispiel für ein JSON-Objekt:

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

Dieses JSON-Objekt enthält eine Zeichenkette, eine Zahl, einen Boolean und ein Array. Das Verständnis dieser Struktur ist grundlegend für das Parsen und Manipulieren von JSON-Daten in Python.

Arbeiten mit JSON in Python

Das json-Modul von Python macht es einfach, JSON-Strings und -Dateien zu analysieren. Dieses Modul enthält Methoden wie json.loads() zum Lesen von JSON aus einer Zeichenkette und json.load() zum Lesen von JSON aus einer Datei. Umgekehrt werden json.dumps() und json.dump() für das Schreiben von JSON in eine Zeichenkette bzw. eine Datei verwendet.

Lesen von JSON-Daten

Es gibt mehrere Möglichkeiten, JSON-Daten zu lesen, die wir uns im Folgenden ansehen werden.

JSON aus einer Zeichenkette lesen

Um JSON-Daten aus einem String zu lesen, verwendet man die Methode json.loads():

import json

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

print(data)

Ausgabe:

1.png

Lesen von JSON aus einer Datei

Um JSON-Daten aus einer Datei zu lesen, verwendet man die Methode json.load():

import json

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

print(data)

Ausgabe:

2.png

Schreiben von JSON-Daten

Hier sind einige verschiedene Möglichkeiten, JSON-Daten zu schreiben:

JSON in eine Zeichenkette schreiben

Um JSON-Daten in einen String zu schreiben, verwenden Sie die Methode json.dumps():

import json

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

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

Ausgabe:

3.png

JSON in eine Datei schreiben

Um JSON-Daten in eine Datei zu schreiben, verwenden Sie die Methode 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)

Behandlung von verschachteltem JSON

Verschachtelte JSON-Objekte sind üblich, wenn man mit komplexeren Datenstrukturen arbeitet. Python kann diese verschachtelten Strukturen leicht handhaben.

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'])

Ausgabe:

4.png

Benutzerdefinierter JSON-Kodierer

Manchmal muss man benutzerdefinierte Python-Objekte in JSON umwandeln. Dies erfordert einen benutzerdefinierten Kodierer.

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)

Ausgabe:

5.png

Benutzerdefinierter JSON-Decoder

Um JSON-Daten in benutzerdefinierte Python-Objekte zu dekodieren, benötigt man ebenfalls einen benutzerdefinierten 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)

Ausgabe:

6.png

Handhabung häufiger Probleme

Bei der Arbeit mit JSON-Daten können mehrere häufige Fehler auftreten, insbesondere beim Parsen, Generieren oder Zugreifen auf JSON-Daten. Hier sind einige der häufigsten:

Ungültiges JSON-Format

Ein häufiger Fehler beim Parsen von JSON ist das Auftreten eines ungültigen JSON-Formats. JSON erfordert doppelte Anführungszeichen um Schlüssel und Zeichenkettenwerte sowie eine korrekte Verschachtelung von Klammern und geschweiften Klammern.

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}")

Ausgabe:

7.png

Behandlung fehlender Schlüssel

Beim Parsen von JSON-Daten kann man auf fehlende Schlüssel stoßen. Verwenden Sie die get-Methode, um einen Standardwert bereitzustellen, wenn ein Schlüssel fehlt.

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)

Fehlersuche bei JSON-Parsing-Problemen

Verwenden Sie das pdb-Modul, um Haltepunkte zu setzen und Ihren JSON-Parsing-Code zu debuggen.

import json
import pdb

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

Praktisches Beispiel für den Umgang mit JSON beim Web Scraping

Beim Web Scraping werden häufig Daten aus Web-APIs extrahiert, die JSON-Antworten zurückgeben. Hier ist ein kompaktes Beispiel, das die Requests-Bibliothek und den Endpunkt https://httpbin.org/anything verwendet.

Stellen Sie zunächst sicher, dass Sie die requests-Bibliothek installiert haben:

pip install requests

Dieser Code importiert requests für HTTP-Anfragen und json für die Verarbeitung von JSON-Daten. Er sendet eine GET-Anfrage an die Ziel-URL mit requests.get(url) und parst die JSON-Antwort mit response.json() und wandelt sie in ein Python-Wörterbuch um. Wir ziehen bestimmte Daten wie Header, User Agent, Herkunft und URL ab und geben sie aus.

Der Code enthält eine starke Fehlerbehandlung; er erfasst json.JSONDecodeError, wenn ein JSON-Dekodierungsfehler auftritt, und KeyError, wenn ein bestimmter Schlüssel fehlt, so dass das Programm vor "no data"-Abstürzen geschützt ist. Dank dieser Robustheit des Codes kann es echte Web-Scraping-Aufgaben perfekt bewältigen.

import requests
import json

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

response = requests.get(url)

try:
    data = response.json()

    # Extrahieren bestimmter Daten aus der JSON-Antwort
    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

Jeder Python-Programmierer muss wissen, wie man JSON parst. Mit dem JSON-Modul und der in diesem Handbuch beschriebenen optimalen Vorgehensweise werden Sie in der Lage sein, JSON-Daten schnell genug zu lesen, zu schreiben und zu debuggen. Das setzt voraus, dass Sie Ihre Codes regelmäßig testen und die richtigen Werkzeuge und die aktuellsten Funktionen in Python nutzen, um besser mit JSON umgehen zu können.

Beim Web-Scraping ist das Parsen von JSON wichtig, da die von Web-APIs abgerufenen Daten in der Regel in Form von JSON vorliegen. Außerdem können Sie Informationen aus verschiedenen Webquellen effizient extrahieren, wenn Sie JSON-Daten gut parsen und manipulieren können.

Bemerkungen:

0 Bemerkungen