Menu
Coddy logo textTech

Decodificação personalizada de JSON

Lição 9 de 9 do curso Python JSON da Coddy.

A decodificação JSON personalizada é um recurso avançado do módulo json do Python que permite controlar como os dados JSON são convertidos em objetos Python. Isso é particularmente útil ao lidar com estruturas de dados complexas ou quando você deseja criar objetos Python específicos a partir de dados JSON.

A Classe JSONDecoder

Para implementar a decodificação JSON personalizada, você precisa criar uma subclasse da classe json.JSONDecoder e sobrescrever seu método object_hook:


import json

class CustomDecoder(json.JSONDecoder):
    def object_hook(self, dct):
        # Lógica de decodificação personalizada aqui
        return dct

Usando o Decodificador Personalizado

Depois de definir seu decodificador personalizado, você pode usá-lo com json.loads() ou json.load():


decoded_object = json.loads(json_string, cls=CustomDecoder)

Exemplo: Decodificando para Objetos Personalizados

Vamos ver um exemplo prático onde decodificamos dados JSON em objetos Python personalizados:


import json
from datetime import datetime

class Person:
    def __init__(self, name, birthdate):
        self.name = name
        self.birthdate = birthdate

class CustomDecoder(json.JSONDecoder):
    def object_hook(self, dct):
        if 'name' in dct and 'birthdate' in dct:
            return Person(dct['name'], datetime.fromisoformat(dct['birthdate']))
        return dct

json_string = '{"name": "Alice", "birthdate": "1990-05-15"}'
person = json.loads(json_string, cls=CustomDecoder)

print(type(person))  # Saída: <class '__main__.Person'>
print(person.name)   # Saída: Alice
print(person.birthdate)  # Saída: 1990-05-15 00:00:00

Pontos Chave

  • O método object_hook é chamado para cada objeto decodificado.
  • Você pode verificar chaves ou padrões específicos para determinar como decodificar o objeto.
  • Retorne o objeto como está se nenhuma decodificação personalizada for necessária para essa estrutura específica.
  • Decodificadores personalizados são úteis para criar objetos específicos do domínio diretamente de dados JSON.

Ao usar decodificadores JSON personalizados, você pode integrar perfeitamente os dados JSON ao modelo de objetos do seu aplicativo Python, tornando a desserialização de dados mais flexível e alinhada às suas necessidades específicas.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

challenge icon

Desafio

Fácil

Crie um decodificador JSON personalizado para um sistema de dados meteorológicos. O decodificador deve converter strings JSON em objetos WeatherData com atributos e conversões específicos. Implemente o seguinte:

  1. Defina uma classe WeatherData com os atributos: location, temperature, humidity e conditions.
  2. Crie uma subclasse personalizada de JSONDecoder que:
    • Converta a temperatura de Fahrenheit para Celsius, arredondada para uma casa decimal.
    • Garanta que a umidade seja representada como uma porcentagem (por exemplo, 0.65 torna-se 65%).
    • Capitalize cada palavra na string de condições (conditions).
  3. Implemente uma função que receba uma string JSON, use o decodificador personalizado para analisá-la e retorne uma string formatada com os dados meteorológicos.

A seguinte entrada será fornecida:


{"location": "new york", "temperature": 72, "humidity": 0.65, "conditions": "partly cloudy"}

Imprima a string formatada resultante no seguinte formato:

"Location: [location], Temperature: [temp]°C, Humidity: [humidity], Conditions: [conditions]"

Experimente você mesmo

Here's a suitable starter code for the challenge:

```python
import json

# Read input
json_string = input()

class WeatherData:
    def __init__(self, location, temperature, humidity, conditions):
        self.location = location
        self.temperature = temperature
        self.humidity = humidity
        self.conditions = conditions

class CustomJSONDecoder(json.JSONDecoder):
    def __init__(self, *args, **kwargs):
        json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs)

    def object_hook(self, dct):
        # TODO: Implement the custom decoding logic here
        pass

def parse_weather_data(json_string):
    # TODO: Implement the parsing function here
    pass

# TODO: Use the CustomJSONDecoder and parse_weather_data function to process the input

# Placeholder for the result
result = "Location: [location], Temperature: [temp]°C, Humidity: [humidity], Conditions: [conditions]"

# Output the result
print(result)
```

Todas as lições de Python JSON