![](/img/trans.png)
[英]Type annotation for parsing a string in a JSON file to a range using Pydantic in Python
[英]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要将嵌套转换为字符串吗?
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.