You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask返回按值排序的字典自动变为字母序,如何保留排序结果?

问题原因

你本地打印排序后的字典顺序正常,但Flask接口返回自动按键排序,核心原因是Flask默认的JSON序列化规则强制开启了按键字母排序的配置:

  1. Python 3.7及以上版本的原生字典默认保留插入顺序,所以你本地打印sorted_top_five顺序是对的
  2. 但Flask在将返回的字典转换为JSON响应时,默认启用了sort_keys=True参数,会无视字典本身的插入顺序,强制按key的字母序重新排列输出。
解决方案

分几种场景可选:

  • 方案1:全局关闭Flask的JSON键排序配置
    直接在初始化Flask app的代码里加配置即可,不同版本写法略有区别:

    # Flask 2.3 及以上版本写法
    app = Flask(__name__)
    app.json.sort_keys = False
    
    # Flask 2.3 以下版本写法
    app = Flask(__name__)
    app.config['JSON_SORT_KEYS'] = False
    

    配置后所有接口返回字典都会保留原有插入顺序,不需要修改你现有接口的业务代码。

  • 方案2:仅针对当前接口保留排序,不影响全局配置
    不需要改全局配置,直接在当前接口里手动完成JSON序列化,指定不排序后返回响应即可:

    from flask import Response
    import json
    
    @app.route('/volume')
    def print_volume():
        # 你原有业务代码不变
        url = "https://api.korbit.co.kr/v1/ticker/detailed/all"
        resp = requests.get(url)
        obj = resp.json()
        total_vol = 0.0
        for i in obj:
            total_vol += float(obj[i]['volume'])
        dict_vol = {}
        for i in obj:
            dict_vol[i[0]] = i[1]['volume']
        sorted_top_five = dict(
            sorted(dict_vol.items(), key=lambda item: item[1], reverse=True))
        print(sorted_top_five)
        # 手动序列化返回,关闭键排序
        return Response(
            json.dumps(sorted_top_five, ensure_ascii=False, sort_keys=False),
            mimetype='application/json'
        )
    
  • 兼容Python 3.7以下版本
    如果你使用的Python版本低于3.7,原生字典不保留插入顺序,需要将排序后的结果存为collections.OrderedDict再返回,同时搭配上面的关闭排序配置即可:

    from collections import OrderedDict
    # 排序时用OrderedDict代替原生dict
    sorted_top_five = OrderedDict(
        sorted(dict_vol.items(), key=lambda item: item[1], reverse=True))
    

内容的提问来源于stack exchange,提问作者jun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:54:04