【发布时间】: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 数组。