Сопоставить "плоский" JSON со сложным классом данных - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь преобразовать «плоский» объект JSON в более сложный объект, используя классы данных и библиотеку dataclasses- json. К сожалению, я не могу изменить структуру JSON. Пример JSON, который я пытаюсь декодировать, может быть:

j = {
    "name": "hello",
    "added_at": "2020-01-01T12:00:00+00:00",
    "foo_item_pk": 1,
    "foo_item_name": "foo",
    "bar_item_pk: 2,
    "bar_item_name": "bar"
}

Есть ли хороший способ кодировать / декодировать JSON в / из такой структуры:

@dataclass_json
@dataclass
class Item:
    pk: int
    name: str

@dataclass_json
@dataclass
class Data:
    pk: int
    added_at: added_at: datetime.datetime = field(
        metadata=config(
            encoder=datetime.datetime.isoformat,
            decoder=datetime.datetime.fromisoformat,
        )
    )
    foo: Item
    bar: Item

Вызов data.to_json() должен генерировать тот же результат JSON, что и выше.

1 Ответ

0 голосов
/ 16 августа 2020

Вы можете попробовать использовать InitVar.

@dataclass_json
@dataclass
class Item:
    pk: int
    name: str

@dataclass_json
@dataclass
class Data:
    pk: int
    added_at: added_at: datetime.datetime = field(
        metadata=config(
            encoder=datetime.datetime.isoformat,
            decoder=datetime.datetime.fromisoformat,
        )
    )
    foo_item_pk: InitVar[int] = 0
    foo_item_name: InitVar[str] = ''
    foo: Item = field(default=None, init=False)

    def __post_init__(self, foo_item_pk, foo_item_name):
        self.foo = Item(foo_item_pk, foo_item_name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...