【问题标题】:Maintain order when dumping dict to JSON将 dict 转储为 JSON 时保持顺序
【发布时间】:2016-02-05 08:11:46
【问题描述】:

我想将数据库查询的结果序列化为 JSON。每行都有许多列,我添加到一个字典中。列按特定顺序排列,但是当我序列化数据时,顺序会发生变化。我尝试使用OrderedDict,但仍然看到同样的问题。如何保持列的顺序?

res = {'a': i[0], 'b': i[1], 'c': i[2]}
return jsonify(res=res)
res = OrderedDict()
res['a'] = i[0]
res['b'] = i[1]
res['c'] = i[3]
return jsonify(res=res)

【问题讨论】:

  • 字典不保证顺序。你可以试试OrderedDict,但我不知道jsonify 会怎么做——如果顺序很重要,最好使用有序数据结构,

标签: python json flask


【解决方案1】:

Python dicts 和 JSON 对象没有顺序,因此没有直接的方法可以做到这一点。在 Python 中,OrderedDict 维护插入顺序,但在 JSON 中没有等价物。您可以将 dict 转换为其项目的列表,因为列表是有序的。

data = OrderedDict()
data['a'] = 1
data['b'] = 2
jsonify(data=list(data.items()))

如果你需要知道这个特定的列表实际上是一个有序的字典,你可以使用标记方案来标记每个值的类型。这变得相当复杂。您可以在 Flask's session serializer 中找到它的示例。

【讨论】:

    【解决方案2】:

    使用 Flask 的 jsonify() 是不可能的,但只使用普通的香草 json.dumps() 是可能的。唯一的问题是您必须让内容长度匹配,因为这是在响应标头中设置的:

    import json
    from collections import OrderedDict
    from flask import Flask, jsonify
    app = Flask(__name__)
    
    @app.route("/unordered")
    def unordered_dict():
        d = OrderedDict([('e',1),('d',2),('c',3),('b',4),('a',5)])
        output = jsonify(d)
        return output
    
    @app.route("/ordered")
    def ordered_dict():
        d = OrderedDict([('e',1),('d',2),('c',3),('b',4),('a',5)])
        response = json.dumps(d)
        placeholder = '_'*(len(response)-2) # Create a placeholder, -2 due to ""
        output = jsonify(placeholder) # This needs to be the same length as the response
        output.response[0] = response + '\n' # Replace with the actual response
        return output
    

    默认情况下,第一个将按字母键顺序返回,如果app.config['JSON_SORT_KEYS'] = False,则按随机顺序返回。第二个应该按指定的顺序返回键。

    警告:正如其他人所指出的,JSON 规范不需要顺序。但是,似乎大多数浏览器无论如何都尊重顺序,因此可以在顺序很好但不重要的情况下使用它。如果顺序很重要,那么您唯一的选择是在转换为 JSON 之前转换为列表。

    (注意:在https://github.com/pallets/flask/issues/1877 之前,Content-Length 没有明确设置,所以要简单得多!)

    【讨论】:

      猜你喜欢
      • 2011-05-29
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2014-07-02
      • 2012-10-28
      • 1970-01-01
      相关资源
      最近更新 更多