Guida al parsing di JSON in Python

Commenti: 0

JSON è l'acronimo di JavaScript Object Notation. Non solo è leggero, ma è anche facile da leggere e scrivere per gli esseri umani. Allo stesso modo, le macchine lo trovano facile da analizzare e generare. L'analisi di JSON è estremamente importante quando si lavora con dati provenienti da API, file di configurazione o altre fonti di informazioni memorizzate per qualsiasi sviluppatore Python. Questo articolo illustra le procedure di base per l'analisi di JSON utilizzando il modulo JSON di Python.

Comprendere JSON e la sua struttura

JSON rappresenta i dati come coppie chiave-valore, simili a un dizionario Python. Ecco un esempio di base di un oggetto JSON:

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

Questo oggetto JSON include una stringa, un numero, un booleano e un array. La comprensione di questa struttura è fondamentale per analizzare e manipolare i dati JSON in Python.

Lavorare con JSON in Python

Il modulo json di Python semplifica l'analisi di stringhe e file JSON. Questo modulo include metodi come json.loads() per leggere JSON da una stringa e json.load() per leggere JSON da un file. Viceversa, json.dumps() e json.dump() sono utilizzati per scrivere JSON rispettivamente su una stringa e su un file.

Lettura di dati JSON

Esistono diversi modi per leggere i dati JSON, che vedremo in seguito.

Lettura di JSON da una stringa

Per leggere i dati JSON da una stringa, utilizzare il metodo json.loads():

import json

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

print(data)

Uscita:

1.png

Lettura di JSON da un file

Per leggere i dati JSON da un file, utilizzare il metodo json.load():

import json

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

print(data)

Uscita:

2.png

Scrittura di dati JSON

Ecco alcuni modi diversi per scrivere dati JSON:

Scrivere JSON in una stringa

Per scrivere i dati JSON in una stringa, utilizzare il metodo json.dumps():

import json

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

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

Uscita:

3.png

Scrivere JSON in un file

Per scrivere i dati JSON su un file, utilizzare il metodo 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)

Gestione di JSON annidati

Gli oggetti JSON annidati sono comuni quando si lavora con strutture di dati più complesse. Python può gestire facilmente queste strutture annidate.

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

Uscita:

4.png

Codificatore JSON personalizzato

A volte è necessario convertire oggetti Python personalizzati in JSON. Ciò richiede un codificatore personalizzato.

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)

Uscita:

5.png

Decodificatore JSON personalizzato

Allo stesso modo, per decodificare i dati JSON in oggetti Python personalizzati, è necessario un decodificatore personalizzato.

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)

Uscita:

6.png

Gestire i problemi comuni

Lavorare con i dati JSON può portare a diversi errori comuni, in particolare durante l'analisi, la generazione o l'accesso ai dati JSON. Ecco alcuni dei più comuni:

Formato JSON non valido

Un errore comune durante l'analisi di JSON è il riscontro di un formato JSON non valido. JSON richiede doppi apici intorno alle chiavi e ai valori delle stringhe e un'adeguata nidificazione di parentesi e graffe.

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

Uscita:

7.png

Gestione delle chiavi mancanti

Durante l'analisi dei dati JSON, si possono incontrare chiavi mancanti. Utilizzare il metodo get per fornire un valore predefinito se una chiave è mancante.

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)

Debugging dei problemi di parsing JSON

Usare il modulo pdb per impostare punti di interruzione e fare il debug del codice di parsing JSON.

import json
import pdb

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

Esempio pratico di gestione di JSON nel web scraping

Il web scraping spesso comporta l'estrazione di dati da API web che restituiscono risposte JSON. Ecco un esempio compatto che utilizza la libreria requests e l'endpoint https://httpbin.org/anything.

Per prima cosa, assicurarsi di avere installato la libreria requests:

pip install requests

Questo codice importa requests per le richieste HTTP e json per gestire i dati JSON. Invia una richiesta GET all'URL di destinazione usando requests.get(url) e analizza la risposta JSON con response.json(), trasformandola in un dizionario Python. Si estraggono e si stampano dati particolari come intestazioni, user agent, origine e URL.

Il codice contiene una forte gestione degli errori; cattura json.JSONDecodeError quando si verifica un errore di decodifica JSON e KeyError quando una chiave specifica è assente, rendendo di conseguenza il programma protetto da crash "senza dati". Questa robustezza del codice consente quindi di gestire perfettamente le attività di web scraping reali.

import requests
import json

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

response = requests.get(url)

try:
    data = response.json()

    # Estrazione di dati specifici dalla risposta 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

Ogni codificatore Python deve sapere come analizzare JSON. Con il modulo JSON e il modo migliore per farlo evidenziato da questo manuale, sarete in grado di leggere, scrivere ed eseguire il debug dei dati JSON abbastanza velocemente. Ciò implica che verificherete regolarmente i vostri codici e farete uso degli strumenti corretti e delle funzionalità più attuali disponibili in Python per migliorare le capacità di gestione di JSON.

Quando si effettua il web scraping, l'analisi di JSON è importante, considerando il fatto che i dati recuperati dalle API web si presentano solitamente sotto forma di JSON Inoltre, è possibile estrarre informazioni da varie fonti web in modo efficiente, se si è in grado di analizzare e manipolare i dati JSON in modo corretto.

Commenti:

0 Commenti