Пользовательское декодирование JSON
Урок 9 из 9 курса Python и JSON на Coddy.
Кастомное декодирование JSON — это продвинутая возможность модуля Python json, которая позволяет вам контролировать, как данные JSON преобразуются в объекты Python. Это особенно полезно при работе со сложными структурами данных или когда вы хотите создавать специфические объекты Python из данных JSON.
Класс JSONDecoder
Чтобы реализовать кастомное декодирование JSON, вам нужно создать подкласс класса json.JSONDecoder и переопределить его метод object_hook:
import json
class CustomDecoder(json.JSONDecoder):
def object_hook(self, dct):
# Здесь логика кастомного декодирования
return dct
Использование кастомного декодера
После того как вы определили свой кастомный декодер, вы можете использовать его с json.loads() или json.load():
decoded_object = json.loads(json_string, cls=CustomDecoder)
Пример: декодирование в кастомные объекты
Давайте рассмотрим практический пример, в котором мы декодируем данные JSON в кастомные объекты Python:
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)) # Вывод: <class '__main__.Person'>
print(person.name) # Вывод: Alice
print(person.birthdate) # Вывод: 1990-05-15 00:00:00
Ключевые моменты
- Метод
object_hookвызывается для каждого декодированного объекта. - Вы можете проверять наличие определенных ключей или паттернов, чтобы определить, как декодировать объект.
- Возвращайте объект как есть, если для данной конкретной структуры не требуется кастомное декодирование.
- Кастомные декодеры полезны для создания объектов предметной области напрямую из данных JSON.
Используя кастомные декодеры JSON, вы можете беспрепятственно интегрировать данные JSON в объектную модель вашего приложения на Python, делая десериализацию данных более гибкой и соответствующей вашим конкретным потребностям.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоСоздайте пользовательский декодер JSON для системы данных о погоде. Декодер должен преобразовывать строки JSON в объекты WeatherData со специфическими атрибутами и преобразованиями. Реализуйте следующее:
- Определите класс
WeatherDataс атрибутами:location,temperature,humidityиconditions. - Создайте пользовательский подкласс
JSONDecoder, который:- Преобразует температуру из Фаренгейта в Цельсий, округляя до одного знака после запятой.
- Гарантирует, что влажность представлена в процентах (например, 0.65 становится 65%).
- Пишет каждое слово в строке conditions с заглавной буквы.
- Реализуйте функцию, которая принимает строку JSON, использует пользовательский декодер для её парсинга и возвращает отформатированную строку с данными о погоде.
Будут предоставлены следующие входные данные:
{"location": "new york", "temperature": 72, "humidity": 0.65, "conditions": "partly cloudy"}
Выведите результирующую отформатированную строку в следующем формате:
"Location: [location], Temperature: [temp]°C, Humidity: [humidity], Conditions: [conditions]"
Попробуйте сами
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)
```