【发布时间】:2022-01-17 02:05:17
【问题描述】:
我正在使用 JSON 数据结构并尝试将其表示为数据类。数据结构(部分)是循环的,我希望嵌套的数据结构也可以整齐地表示为数据类。
我在正确解析数据类时遇到了一些问题。请参阅下面的简化示例:
from typing import List, Optional, Union
class SchemaTypeName(Enum):
LONG = "long"
NULL = "null",
RECORD = "record"
STRING = "string"
@dataclass_json
@dataclass
class SchemaType():
type: Union[
SchemaTypeName,
'SchemaType',
List[
Union[
SchemaTypeName,
'SchemaType'
]
]
]
fields: Optional[List['SchemaType']] = None
name: Optional[str] = None
下面是调用from_dict 后返回的对象的打印输出,其中包含一些示例数据。请注意,嵌套对象(用箭头表示)未正确解析为数据类。
SchemaType(
type=[
'null',
------> {
'fields': [
{'name': 'id', 'type': 'string'},
{'name': 'date', 'type': ['null', 'long']},
{'name': 'name', 'type': ['null', 'string']}
],
'type': 'record'
}
]
)
我是否错误地声明了 type 字段的类型提示?
我将Python 3.9 与dataclasses_json==0.5.2 和marshmallow==3.11.1 一起使用。
【问题讨论】:
-
嗯,您对 dataclass-json 库的工作方式有一些假设错误:1) 构造函数或
__init__方法不会自动替换,因此验证和数据转换将不起作用方式正常。我不明白的是,您将需要使用from_dict之类的辅助方法。 2) 你不需要同时使用@dataclass_json装饰器和DataClassJsonMixin子类;至少从我的理解来看,两者都使用是多余的。 -
正确,我在单元测试中使用了
from_dict,该单元测试产生了我在问题中包含的打印输出。我使用装饰器来传递示例中遗漏的一些附加参数。DataClassJsonMixin帮助mypy接受额外的方法,例如from_dict,它不会接受那些只有装饰器的方法。 -
感谢您的反馈,我已经相应地澄清了问题。
-
嗯,您确定
type的最外层遇到的值将始终是SchemaType 或SchemaTypeName,并且它的所有后续值(例如嵌套在fields中)只会是SchemaTypeName?如果是这样,可能有一个简单的解决方案。 -
在
fields内只能是SchemaType对象的列表。在type中可以存在SchemaTypeName、SchemeType或List,这两种类型都可以混合使用。我认为这种混合在解析步骤中造成了困难。
标签: python marshmallow python-dataclasses