如何在FastAPI中返回排序后的JSON数据?返回排序字典响应未排序
问题:按值排序的字典在FastAPI响应中未保持排序
环境版本
- Python: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
Swagger返回结果
{ "class_scores": { "1": 34.8, "2": 22.1, "3": 16.9, "4": 7.8, "5": 26, "6": 23.6 } }
解决方法
方法1:转为键值对列表(推荐)
JSON标准中对象是无序的,即便后端返回有序字典,前端解析时也可能打乱顺序。最可靠的方式是将排序后的字典转为键值对列表:
修改返回前的处理逻辑,把class_scores的字典转换为按值排序的列表:
# 假设result是{"class_scores": 已按值排序的字典} sorted_items = sorted(result["class_scores"].items(), key=lambda x: x[1], reverse=True) result["class_scores"] = [{"class_id": k, "score": v} for k, v in sorted_items]
修改后返回的JSON结构:
{ "class_scores": [ {"class_id": "1", "score": 34.8}, {"class_id": "5", "score": 26}, {"class_id": "6", "score": 23.6}, {"class_id": "2", "score": 22.1}, {"class_id": "3", "score": 16.9}, {"class_id": "4", "score": 7.8} ] }
方法2:配置FastAPI保留字典顺序
如果必须返回字典格式,可以自定义响应类强制保留序列化顺序:
from fastapi import Response import json class OrderedResponse(Response): media_type = "application/json" def render(self, content: any) -> bytes: return json.dumps( content, ensure_ascii=False, sort_keys=False, indent=2 ).encode("utf-8")
然后在路由中指定响应类:
@classifier_router.post("/groupClassifier", response_class=OrderedResponse) async def group_classifier(...): # 原有逻辑不变
注意:这种方法依赖JSON解析工具的实现,部分前端库可能仍不保证顺序,因此方法1兼容性更好。
内容的提问来源于stack exchange,提问作者Mostafa Najmi
相关产品推荐
相关产品推荐

