Menu
Coddy logo textTech

Пользовательское декодирование 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, делая десериализацию данных более гибкой и соответствующей вашим конкретным потребностям.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

challenge icon

Задание

Легко

Создайте пользовательский декодер JSON для системы данных о погоде. Декодер должен преобразовывать строки JSON в объекты WeatherData со специфическими атрибутами и преобразованиями. Реализуйте следующее:

  1. Определите класс WeatherData с атрибутами: location, temperature, humidity и conditions.
  2. Создайте пользовательский подкласс JSONDecoder, который:
    • Преобразует температуру из Фаренгейта в Цельсий, округляя до одного знака после запятой.
    • Гарантирует, что влажность представлена в процентах (например, 0.65 становится 65%).
    • Пишет каждое слово в строке conditions с заглавной буквы.
  3. Реализуйте функцию, которая принимает строку 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)
```

Все уроки раздела Python и JSON