FastAPI 返回已排序的 JSON 数据[重复]

问题描述 投票:0回答:2

虽然我按值返回排序的字典,但 FastAPI 响应未排序。

我正在使用

  • 蟒蛇:3.8.10
  • fastapi:0.95.2
这是我的终点:
@classifier_router.post("/groupClassifier")
async def group_classifier(
    # current_user: User = Depends(get_current_user),
    group_id: str = Query(default="1069302375", description=GROUP_ID_DESC),
    starttime: Union[datetime , None] = DEFAULT_START_TIME,
    endtime: Union[datetime , None] = DEFAULT_END_TIME):
    result = handler.group_classifier(
        [group_id],
        starttime,
        endtime)
    if result==None:
        raise HTTPException(
        status_code=500
        )
    else:
        return result
大摇大摆返回的结果:
{
  "class_scores": {
    "1": 34.8,
    "2": 22.1,
    "3": 16.9,
    "4": 7.8,
    "5": 26,
    "6": 23.6
  }
}
python fastapi
2个回答
0
投票

首先要回答这个问题,在 FastAPI 中,当您在端点中返回一个字典时,它将使用其内部 json 编码 来序列化您的输出,在这种情况下,它可能使用类似:

json.dumps(..., sort_keys=True)
默认情况下。 为了避免这种情况,您可以直接返回
JsonResponse

from fastapi.responses import JSONResponse

@classifier_router.post("/groupClassifier")
async def group_classifier(
    # current_user: User = Depends(get_current_user),
    group_id: str = Query(default="1069302375", description=GROUP_ID_DESC),
    starttime: Union[datetime , None] = DEFAULT_START_TIME,
    endtime: Union[datetime , None] = DEFAULT_END_TIME):
    result = handler.group_classifier(
        [group_id],
        starttime,
        endtime)
    if result is None:
        raise HTTPException(status_code=500)
    return JSONResponse(content=result)

在其他方面,如果顺序对你来说很重要,也许使用字典不是最合适的数据结构,你可能应该考虑返回一个字典列表,或者只是一个列表,其中班级分数的索引相当于关键


0
投票

如果您使用 JSON 返回响应类型,它将对键重新排序,因为 fastAPI 使用 json_enocode (https://fastapi.tiangolo.com/tutorial/encoder/)

解决这个问题,可以返回json响应media-type application/text;这将返回一个文本响应,即返回将是一个字符串。

from fastapi import Response
@classifier_router.post("/groupClassifier")
async def group_classifier(
    # current_user: User = Depends(get_current_user),
    group_id: str = Query(default="1069302375", description=GROUP_ID_DESC),
    starttime: Union[datetime , None] = DEFAULT_START_TIME,
    endtime: Union[datetime , None] = DEFAULT_END_TIME):
    result = handler.group_classifier(
        [group_id],
        starttime,
        endtime)
    if result==None:
        raise HTTPException(
        status_code=500
        )
    else:
        return Response(
                content=json.dumps(result), media_type="application/text"
            )

我希望这对你有用。我有同样的问题,我已经使用上述更改解决了,即更改 media_type 作为响应。

© www.soinside.com 2019 - 2024. All rights reserved.