python 如何保持传递给jsonify()函数的排序字典的顺序?

kxe2p93d  于 2023-10-14  发布在  Python
关注(0)|答案(6)|浏览(155)

我尝试将排序字典传递给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()函数,然后例如控制台.log()输出flask数据时,orderd变成了这样:11,aa,bb.除此之外,我做了一些研究,发现了this stackoverflow的答案,导致了一些很好的文档注解,其中明确指出,设置 JSON_SORT_KEYSFalse 是不推荐的方式。然后我检查了this github issue,似乎这个问题在flask中没有完全解决。
在我的情况下,解决这个问题的最佳方法是什么?

llmtgqce

llmtgqce1#

将此配置行添加到应用程序定义后的代码中:

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

**更新:**对于Flask 2.3和更高版本,请使用以下命令:

app.json.sort_keys = False
pokxtpni

pokxtpni2#

JSON对象是 * 无序结构 *,您的浏览器很容易再次丢弃JSON键的顺序。
关于JSON standard
对象是一个无序的名称/值对集合。
大胆强调我的。要保持标准兼容性,请使用 list(JSON数组)来捕获特定的顺序。
也就是说,Flask可以保留您使用OrderedDict设置的顺序。

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

在默认的True设置下,jsonify()对键进行排序,以提供可缓存的稳定HTTP响应。文档警告不要禁用此选项,只是为了让您意识到将其设置为False的缺点。
然而,如果你使用的是Python 3.6或更高版本,这个问题实际上并不重要,因为在那个版本中,内置的dict类型也保留了插入顺序,所以从一个Python运行到下一个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'])
aij0ehis

aij0ehis3#

在最新版本的Flask (2.3)中,设置app.config['JSON_SORT_KEYS'] = False的解决方案不再起作用,在Flask的基于Apache的兄弟Quart中也是如此。
关闭排序的新方法是更新应用JSONProvider示例上的sort_keys属性:

from flask import Flask  # or from quart import Quart, etc.

app = Flask(__name__)
app.json.sort_keys = False

或者如果你已经在使用自定义的JSONProvider子类:

from flask import Flask
from flask.json.provider import DefaultJSONProvider

class CustomJSONProvider(DefaultJSONProvider):
    sort_keys = False

app = Flask(__name__)
app.json = CustomJSONProvider(app)
j91ykkif

j91ykkif4#

默认情况下,json中的键排序为true。你需要在你的项目配置中覆盖它,如下所示:

app.config['JSON_SORT_KEYS'] = False
atmip9wb

atmip9wb5#

请参考Flask文档2.3.x changes(发布日期:2023-04-25
删除JSON_AS_ASCIIJSON_SORT_KEYSJSONIFY_MIMETYPEJSONIFY_PRETTYPRINT_REGULAR配置项。
版本2.3.x有一个带有默认参数的DefaultJSONProvider类:sort_keys = True

要禁用默认JSON(dict)键排序,请执行以下操作:

from flask import Flask

app = Flask(__name__)
app.json.sort_keys = False
6kkfgxo0

6kkfgxo06#

试试这个

app.json.sort_keys = False

相关问题