繁体   English   中英

从 pydantic Json 类型中检索 JSON 字符串

[英]Retrieve JSON string from pydantic Json type

我有一个 pydantic model 如下。

from pydantic import Json, BaseModel
class Foo(BaseModel):
    id: int
    bar: Json

Foo.bar 可以将 JSON 字符串解析为输入并将其存储为一个很好的字典。

foo = Foo(id=1, bar='{"foo": 2, "bar": 3}')
type(foo.bar) #outputs dict

如果我想让整个 object 成为一个dict ,我可以做到

foo.dict()
#outputs
{'id': 1, 'bar': {'foo': 2, 'bar': 3}}

但是如何将bar导出为 JSON 字符串,如下所示

{'id': 1, 'bar': '{"foo": 2, "bar": 3}'}

我想将 JSON 写回数据库。

Pydantic 作者在这里。

如果不调用json.dumps(foo.bar) ,目前没有办法做到这一点。 如果您愿意,您可以在Foo上创建一个方法,这将更容易使用但需要相同的处理。

如果性能至关重要,或者您需要与开头完全相同的 JSON 字符串(相同的空格等),您可以执行以下操作之一:

  • bar设为字符串字段,但添加验证器以检查其是否有效 JSON
  • 创建一个自定义数据类型来解析 JSON 但还保留对原始 JSON 字符串的引用

要将嵌套转换为字符串吗?

x = {'id': 1, 'bar': str({'foo': 2, 'bar': 3})}

{'id': 1, 'bar': "{'foo': 2, 'bar': 3}"}

在我的场景中解决问题的解决方法是继承 BaseModel 并覆盖dict方法。

class ExtendedModel(BaseModel):
    def dict(self, json_as_string=False, **kwargs) -> dict:
        __dict = super().dict(**kwargs)
        if json_as_string:
            for field, _ in self.schema()['properties'].items():
                if _.get('format') == 'json-string' and field in __dict :
                    __dict[field] = json.dumps(getattr(self, field))
        return __dict
 

self.__field__不会指定字段的类型是否实际上是 Json。 它以 Any 的形式返回。 所以我使用了这个方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM