首页 > 解决方案 > 嵌套数据类的 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)

但是使用该方法也不会影响(错误)结果。任何进一步的提示?

标签: pythonpython-dataclassesjson-serialization

解决方案


您可以使用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}

推荐阅读