【问题标题】:how to keep order of sorted dictionary passed to jsonify() function?如何保持传递给 jsonify() 函数的排序字典的顺序?
【发布时间】:2019-06-24 01:23:36
【问题描述】:

我正在尝试将排序的字典传递给 jsonify() 函数,然后在 JS 代码中使用它来取出值。我看到的是,即使我传递了正确的值,由于某种原因它们被 jsonify 重新排序。


json_data = {
    "11": {
        "j_id": "out",
    },
    "aa": {
        "j_id": "in",
    },
    "bb": {
        "j_id": "out",
    },
}

jkeys=json_data.keys()
sorted_json = sorted(jkeys, key=lambda x: json_data[x]['j_id'], reverse=False)

new_sorted=OrderedDict()
for rec in sorted_json:
    new_sorted[rec]=json_data[rec]

print('sort dict: {}'.format(new_sorted))

输出是正确的,我可以看到正确的值,在我的情况下应该是:aa, 11, bb

>>> from collections import OrderedDict
>>>
>>> json_data = {
...     "11": {
...         "j_id": "out",
...     },
...     "aa": {
...         "j_id": "in",
...     },
...     "bb": {
...         "j_id": "out",
...     },
... }
>>>
>>> jkeys=json_data.keys()
>>> sorted_json = sorted(jkeys, key=lambda x: json_data[x]['j_id'], reverse=False)
>>>
>>> new_sorted=OrderedDict()
>>> for rec in sorted_json:
...     new_sorted[rec]=json_data[rec]
...
>>> print('sort dict: {}'.format(new_sorted))
sort dict: OrderedDict([('aa', {'j_id': 'in'}), ('11', {'j_id': 'out'}), ('bb', {'j_id': 'out'})])

不幸的是,当我将它传递给 jsonify() 函数,然后例如 console.log() 输出烧瓶数据时,顺序变成这样:11,aa,bb。除此之外,我做了一些研究,发现this stackoverflow 答案,导致一些good documentation notes 明确指出不推荐将 JSON_SORT_KEYS 设置为 False .然后我检查了this github issue,似乎问题在烧瓶中没有完全解决。

在我的情况下,最好的解决方法是什么?

【问题讨论】:

  • JSON 对象是非有序结构。如果您需要按特定顺序排列,请使用列表。
  • OrderedDict 序列化为 JSON 会生成一个保留顺序的 JSON 文档,但这并不意味着再次从 JSON 解码的 Javascript 客户端不会放弃您的排序。如果您觉得指定顺序很重要,您必须使用app.config["JSON_SORT_KEYS"] = False
  • 这里真的没有“问题”。 JSON 对象没有顺序。您不应该编写依赖于序列化为 JSON 对象的任何特定数据顺序的代码。如果您需要订购,请使用 JSON 数组。

标签: python flask


【解决方案1】:

在应用定义之后将此配置行添加到您的代码中:

app = Flask(__name__)
app.config['JSON_SORT_KEYS'] = False

【讨论】:

  • 谢谢你,这绝对是疯了, false 不是默认值
【解决方案2】:

JSON 对象是无序结构,您的浏览器很容易再次丢弃 JSON 键的顺序。

来自JSON standard

对象是一组无序名称/值对。

我的大胆强调。要保持符合标准,请使用 list(JSON 数组)来捕获特定顺序。

也就是说,Flask 可以保留您使用OrderedDict 设置的顺序。

  • 使用JSON_SORT_KEYS = False禁用应用程序范围内的排序。

    使用默认的True 设置,jsonify() 对键进行排序以提供可缓存的稳定 HTTP 响应。文档警告不要禁用此功能,只是为了让您了解将其设置为 False 的缺点。

    但是,如果您使用的是 Python 3.6 或更新版本,这个问题实际上并没有发挥作用,因为从那个版本开始,内置的 dict 类型也是 preserves insertion order,因此从 1 更改顺序没有问题Python 运行到下一个。

  • 不要使用jsonify(),而是直接使用flask.json.dumps(),并创建自己的Response 对象。传入sort_keys=False

    from flask import json
    
    response = current_app.response_class(
        json.dumps(new_sorted, sort_keys=False),
        mimetype=current_app.config['JSONIFY_MIMETYPE'])
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 2021-05-08
    • 2020-11-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 2022-11-18
    相关资源
    最近更新 更多