Menu
Coddy logo textTech

Decodificación personalizada de JSON

Lección 9 de 9 del curso Python JSON de Coddy.

La decodificación JSON personalizada es una característica avanzada del módulo json de Python que le permite controlar cómo se convierten los datos JSON en objetos de Python. Esto es particularmente útil cuando se trata de estructuras de datos complejas o cuando desea crear objetos de Python específicos a partir de datos JSON.

La clase JSONDecoder

Para implementar la decodificación JSON personalizada, debe crear una subclase de la clase json.JSONDecoder y sobrescribir su método object_hook:


import json

class CustomDecoder(json.JSONDecoder):
    def object_hook(self, dct):
        # Custom decoding logic here
        return dct

Uso del decodificador personalizado

Una vez que haya definido su decodificador personalizado, puede usarlo con json.loads() o json.load():


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

Ejemplo: Decodificación a objetos personalizados

Veamos un ejemplo práctico donde decodificamos datos JSON en 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))  # Output: <class '__main__.Person'>
print(person.name)   # Output: Alice
print(person.birthdate)  # Output: 1990-05-15 00:00:00

Puntos clave

  • El método object_hook se llama para cada objeto decodificado.
  • Puede buscar claves o patrones específicos para determinar cómo decodificar el objeto.
  • Devuelva el objeto tal cual si no se necesita una decodificación personalizada para esa estructura en particular.
  • Los decodificadores personalizados son útiles para crear objetos específicos del dominio directamente a partir de datos JSON.

Al utilizar decodificadores JSON personalizados, puede integrar sin problemas los datos JSON en el modelo de objetos de su aplicación Python, haciendo que la deserialización de datos sea más flexible y alineada con sus necesidades específicas.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

challenge icon

Desafío

Fácil

Crea un decodificador JSON personalizado para un sistema de datos meteorológicos. El decodificador debe convertir cadenas JSON en objetos WeatherData con atributos y conversiones específicos. Implementa lo siguiente:

  1. Define una clase WeatherData con los atributos: location, temperature, humidity y conditions.
  2. Crea una subclase de JSONDecoder personalizada que:
    • Convierta la temperatura de Fahrenheit a Celsius, redondeada a un decimal.
    • Asegure que la humedad se represente como un porcentaje (por ejemplo, 0.65 se convierte en 65%).
    • Ponga en mayúscula cada palabra en la cadena de condiciones.
  3. Implementa una función que tome una cadena JSON, use el decodificador personalizado para analizarla y devuelva una cadena formateada con los datos meteorológicos.

Se proporcionará la siguiente entrada:


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

Imprime la cadena formateada resultante en el siguiente formato:

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

Pruébalo tú mismo

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 las lecciones de Python JSON