首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从pydantic JSON类型检索Json字符串

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

Stack Overflow用户
提问于 2021-05-28 08:11:38
回答 4查看 5.4K关注 0票数 5

我有一个发烧的模型如下。

代码语言:javascript
运行
复制
from pydantic import Json, BaseModel
class Foo(BaseModel):
    id: int
    bar: Json

Foo.bar可以将JSON字符串解析为输入,并将其存储为dict,这很好。

代码语言:javascript
运行
复制
foo = Foo(id=1, bar='{"foo": 2, "bar": 3}')
type(foo.bar) #outputs dict

如果我想让整个对象成为一个dict,我可以这样做

代码语言:javascript
运行
复制
foo.dict()
#outputs
{'id': 1, 'bar': {'foo': 2, 'bar': 3}}

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

代码语言:javascript
运行
复制
{'id': 1, 'bar': '{"foo": 2, "bar": 3}'}

我想把JSON写回数据库.

EN

回答 4

Stack Overflow用户

发布于 2021-05-28 08:27:18

这是毕丹派的作者。

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

如果性能非常关键,或者需要完全相同的JSON字符串(相同的空格等)。您可以执行以下操作之一:

  • 使bar成为一个字符串字段,但是添加了一个验证器来检查它的有效性JSON
  • 创建一个自定义数据类型来解析JSON,但也保留对原始JSON字符串

的引用

票数 10
EN

Stack Overflow用户

发布于 2021-05-28 08:17:49

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

代码语言:javascript
运行
复制
x = {'id': 1, 'bar': str({'foo': 2, 'bar': 3})}

给出

代码语言:javascript
运行
复制
{'id': 1, 'bar': "{'foo': 2, 'bar': 3}"}
票数 0
EN

Stack Overflow用户

发布于 2021-06-09 15:27:55

解决方案中问题的解决方法是继承BaseModel并重写dict方法。

代码语言:javascript
运行
复制
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。它正像其他人一样回归。所以我用了这个方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67735198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档