为什么 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"}

其他尝试:

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))