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_hookse 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.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Desafío
FácilCrea 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:
- Define una clase
WeatherDatacon los atributos:location,temperature,humidityyconditions. - Crea una subclase de
JSONDecoderpersonalizada 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.
- 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
3Decodificación de JSON
json.loads()Manejo de tipos de datos JSONDecodificación personalizada de JSON