为什么 pydantic 不在 json 中编码我的 bool?
Why does pydantic not encode my bool in json?
我想让 Pydantic 将布尔值写为“y”或“n”。 Pydantic documentation on encoders 建议我可以配置一种方法来根据数据类型对值进行编码,在我的例子中是 bool
.
from pydantic import BaseModel
class MyStuff(BaseModel):
do_it: bool = False
class Config:
json_encoders = {
bool: lambda b: "y" if b else "n",
}
ms = MyStuff()
print(ms.json(exclude_defaults=False))
当我运行这个时,我得到
{"do_it": false}
如我所料
{"do_it": "n"}
其他尝试:
我是否指定默认值都无所谓
我也无法让它适用于 int
等其他基本数据类型,但它确实适用于 pathlib.Path
.
如果我用这样的函数替换lambda
,它也不起作用:
def convert_my_bool(b: bool) -> str:
if b:
return "y"
return "n"
class MyStuff(BaseModel):
do_it: bool
class Config:
json_encoders = {
bool: convert_my_bool,
}
我在这里错过了什么?我需要如何编写 Config
才能在我的模型中将布尔值写为“y”或“n”?
import orjson
from pydantic import BaseModel
def orjson_dumps(v, *, default=None):
for key, value in v.items():
if isinstance(value, bool):
v[key] = "y" if value else "n"
return orjson.dumps(
v,
default=default,
).decode()
class MyStuff(BaseModel):
do_it: bool = False
class Config:
# Change default json encoders/decoders to orjson ones
json_loads = orjson.loads
json_dumps = orjson_dumps
ms = MyStuff()
print(ms.json(exclude_defaults=False))
我想让 Pydantic 将布尔值写为“y”或“n”。 Pydantic documentation on encoders 建议我可以配置一种方法来根据数据类型对值进行编码,在我的例子中是 bool
.
from pydantic import BaseModel
class MyStuff(BaseModel):
do_it: bool = False
class Config:
json_encoders = {
bool: lambda b: "y" if b else "n",
}
ms = MyStuff()
print(ms.json(exclude_defaults=False))
当我运行这个时,我得到
{"do_it": false}
如我所料
{"do_it": "n"}
其他尝试:
我是否指定默认值都无所谓
我也无法让它适用于
int
等其他基本数据类型,但它确实适用于pathlib.Path
.如果我用这样的函数替换
lambda
,它也不起作用:
def convert_my_bool(b: bool) -> str:
if b:
return "y"
return "n"
class MyStuff(BaseModel):
do_it: bool
class Config:
json_encoders = {
bool: convert_my_bool,
}
我在这里错过了什么?我需要如何编写 Config
才能在我的模型中将布尔值写为“y”或“n”?
import orjson
from pydantic import BaseModel
def orjson_dumps(v, *, default=None):
for key, value in v.items():
if isinstance(value, bool):
v[key] = "y" if value else "n"
return orjson.dumps(
v,
default=default,
).decode()
class MyStuff(BaseModel):
do_it: bool = False
class Config:
# Change default json encoders/decoders to orjson ones
json_loads = orjson.loads
json_dumps = orjson_dumps
ms = MyStuff()
print(ms.json(exclude_defaults=False))