我有一个字典,其中一些键是Enum实例(enum.Enum的子类).我正在尝试根据文档使用自定义JSON编码器类将字典编码为JSON字符串.我想要的只是让输出的JSON中的键是Enum名称的字符串.例如,{ TestEnum.one : somevalue }将编码为{ "one" : somevalue }.
我写了一个简单的测试用例,如下所示,我在一个干净的virtualenv中测试过:
import json
from enum import Enum
class TestEnum(Enum):
one = "first"
two = "second"
three = "third"
class TestEncoder(json.JSONEncoder):
""" Custom encoder class """
def default(self, obj):
print("Default method called!")
if isinstance(obj, TestEnum):
print("Seen TestEnum!")
return obj.name
return json.JSONEncoder.default(self, obj)
def encode_enum(obj):
""" Custom encoder method """
if isinstance(obj, TestEnum):
return obj.name
else:
raise TypeError("Don't know how to decode this")
if __name__ == "__main__": …Run Code Online (Sandbox Code Playgroud) 我已经使用 FastAPI 构建了一个 API,并尝试从客户端向它发送数据。
API 和客户端都使用类似的 Pydantic 模型来处理我要提交的数据。这包括一个包含文件路径的字段,我将其存储在 pathlib.path 类型的字段中。
然而,FastAPI 不接受提交,因为它显然无法处理路径对象:
TypeError: Object of type PosixPath is not JSON serializable
这是显示问题的最小测试文件:
import pathlib
from pydantic import BaseModel
from fastapi import FastAPI
from fastapi.testclient import TestClient
api = FastAPI()
client = TestClient(api)
class Submission(BaseModel):
file_path: pathlib.Path
@api.post("/", response_model=Submission)
async def add_submission(subm: Submission):
print(subm)
# add submission to database
return subm
def test_add_submission():
data = {"file_path": "/my/path/to/file.csv"}
print("original data:", data)
# create a Submission object, which casts filePath to pathlib.Path:
submission …Run Code Online (Sandbox Code Playgroud)