Guia para analisar JSON em Python

Comentários: 0

JSON significa Notação de Objectos JavaScript. Não só é leve, como também é fácil de ler e escrever para os seres humanos. Da mesma forma, as máquinas acham-no fácil de analisar e gerar. A análise JSON é extremamente importante ao trabalhar com dados de APIs, arquivos de configuração ou outras fontes de informações armazenadas para qualquer desenvolvedor Python. Este artigo leva-o através de procedimentos básicos para analisar JSON usando o módulo JSON do Python.

Entendendo o JSON e sua estrutura

O JSON representa dados como pares chave-valor, semelhante a um dicionário Python. Aqui está um exemplo básico de um objeto JSON:

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

Este objeto JSON inclui uma cadeia de caracteres, um número, um booleano e uma matriz. Entender essa estrutura é fundamental para analisar e manipular dados JSON em Python.

Trabalhando com JSON em Python

O módulo json do Python torna simples a análise de strings e arquivos JSON. Este módulo inclui métodos como json.loads() para ler JSON de uma string, e json.load() para ler JSON de um arquivo. Por outro lado, json.dumps() e json.dump() são usados para escrever JSON em uma string e em um arquivo, respetivamente.

Leitura de dados JSON

Existem várias maneiras de ler dados JSON, que veremos a seguir.

Lendo JSON a partir de uma string

Para ler dados JSON de uma string, use o método json.loads():

import json

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

print(data)

Saída:

1.png

Leitura de JSON a partir de um ficheiro

Para ler dados JSON de um arquivo, use o método json.load():

import json

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

print(data)

Saída:

2.png

Escrevendo dados JSON

Aqui estão algumas maneiras diferentes de escrever dados JSON:

Escrevendo JSON em uma string

Para escrever dados JSON em uma string, use o método json.dumps():

import json

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

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

Saída:

3.png

Escrevendo JSON em um arquivo

Para escrever dados JSON em um arquivo, use o método 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)

Tratando JSON aninhado

Os objectos JSON aninhados são comuns quando se trabalha com estruturas de dados mais complexas. Python pode facilmente lidar com essas estruturas aninhadas.

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

Saída:

4.png

Codificador JSON personalizado

Por vezes, é necessário converter objectos Python personalizados em JSON. Isso requer um codificador personalizado.

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)

Saída:

5.png

Descodificador JSON personalizado

Da mesma forma, para decodificar dados JSON em objetos Python personalizados, você precisa de um decodificador personalizado.

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)

Saída:

6.png

Tratar de problemas comuns

Trabalhar com dados JSON pode levar a vários erros comuns, particularmente ao analisar, gerar ou aceder a dados JSON. Aqui estão alguns dos mais comuns:

Formato JSON inválido

Um erro comum ao analisar JSON é encontrar um formato JSON inválido. O JSON requer aspas duplas em torno de chaves e valores de cadeia de caracteres, e o aninhamento adequado de colchetes e chaves.

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

Saída:

7.png

Tratamento de chaves em falta

Ao analisar dados JSON, você pode encontrar chaves ausentes. Use o método get para fornecer um valor padrão se uma chave estiver faltando.

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)

Depuração de problemas de análise de JSON

Use o módulo pdb para definir pontos de interrupção e depurar seu código de análise JSON.

import json
import pdb

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

Exemplo prático de manipulação de JSON na raspagem da Web

A raspagem da Web geralmente envolve a extração de dados de APIs da Web que retornam respostas JSON. Aqui está um exemplo compacto usando a biblioteca de solicitações e o ponto de extremidade https://httpbin.org/anything.

Primeiro, verifique se você tem a biblioteca de solicitações instalada:

pip install requests

Este código importa requests para solicitações HTTP e json para manipular dados JSON. Ele envia uma solicitação GET para o URL de destino usando requests.get(url) e analisa a resposta JSON com response.json(), transformando-a em um dicionário Python. Retiramos e imprimimos dados específicos como cabeçalhos, agente do usuário, origem e URL.

O código contém um forte tratamento de erros; ele captura json.JSONDecodeError quando ocorre um erro de decodificação JSON e KeyError quando uma chave específica está ausente, consequentemente fazendo com que o programa seja protegido contra falhas "sem dados". Essa robustez do código, portanto, permite que ele lide perfeitamente com tarefas reais de raspagem da Web.

import requests
import json

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

response = requests.get(url)

try:
    data = response.json()

    # Extração de dados específicos da resposta 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

Todo programador Python deve saber como analisar JSON. Com o módulo JSON e a melhor maneira de o fazer destacada por este manual, será capaz de ler, escrever e depurar dados JSON com rapidez suficiente. Isso implica que você testará regularmente seus códigos e usará as ferramentas corretas e os recursos mais atuais disponíveis no Python para obter melhores habilidades de manipulação de JSON.

Ao realizar a raspagem da Web, é importante analisar o JSON, considerando o fato de que os dados obtidos das APIs da Web geralmente aparecem na forma de JSON Além disso, você pode extrair informações de várias fontes da Web com eficiência, se puder analisar e manipular os dados JSON de maneira adequada.

Comentários:

0 Comentários