python - 嵌套数据类的 Json 序列化
问题描述
我需要进一步了解Make the Python json encoder support Python's new dataclassesjson serialization of @dataclass
中 的问题:考虑它们何时处于嵌套结构中。
考虑:
import json
from attr import dataclass
from dataclasses_json import dataclass_json
@dataclass
@dataclass_json
class Prod:
id: int
name: str
price: float
prods = [Prod(1,'A',25.3),Prod(2,'B',79.95)]
pjson = json.dumps(prods)
这给了我们:
TypeError: Object of type Prod is not JSON serializable
请注意,上面确实包含了答案之一https://stackoverflow.com/a/59688140/1056563。它声称通过dataclass_json
装饰器支持嵌套案例。显然这实际上不起作用。
我还尝试了另一个答案https://stackoverflow.com/a/51286749/1056563:
class EnhancedJSONEncoder(json.JSONEncoder):
def default(s, o):
if dataclasses.is_dataclass(o):
return dataclasses.asdict(o)
return super().default(o)
我为它创建了一个辅助方法:
def jdump(s,foo):
return json.dumps(foo, cls=s.c.EnhancedJSONEncoder)
但是使用该方法也不会影响(错误)结果。任何进一步的提示?
解决方案
您可以使用pydantic
库。从文档中的示例
from pydantic import BaseModel
class BarModel(BaseModel):
whatever: int
class FooBarModel(BaseModel):
banana: float
foo: str
bar: BarModel
m = FooBarModel(banana=3.14, foo='hello', bar={'whatever': 123})
# returns a dictionary:
print(m.dict())
"""
{
'banana': 3.14,
'foo': 'hello',
'bar': {'whatever': 123},
}
"""
print(m.dict(include={'foo', 'bar'}))
#> {'foo': 'hello', 'bar': {'whatever': 123}}
print(m.dict(exclude={'foo', 'bar'}))
#> {'banana': 3.14}
推荐阅读
- php - Laravel s3使用预签名的url上传带有元数据的文件
- google-sheets - 如何根据其他列的数据过滤列?(编辑:附图以供理解)
- vim - Vim 高级多行编辑
- django - 来自第三方 API 的 Django 外部模型
- python - Python中有什么方法可以改变列的位置吗?
- python - 根据其他数据帧上的条件将 True / False 值添加到 pandas 数据帧
- ios - 导入某些组件模块时反应本机应用程序崩溃
- node.js - Nestjs纱线构建失败错误:找不到模块'./_assignValue'
- r - 如何加快 R 中的 while 循环(可能使用 dopar)?
- python - RecursionError 使用 PuLP 优化