python json转储,如何使指定键优先?
我想将此json转储到一个文件:python json转储,如何使指定键优先?,python,json,Python,Json,我想将此json转储到一个文件: json.dumps(data) 以下是数据: { "list":[ "one": { "id": "12","desc":"its 12","name":"pop"}, "two": {"id": "13","desc":"its 13","name":"kindle"} ] } 我希望id成为我将其转储到文件后的第一个属性,但事实并非如此。我该如何解决这个问题呢?我猜这是因为你在使
json.dumps(data)
以下是数据:
{
"list":[
"one": { "id": "12","desc":"its 12","name":"pop"},
"two": {"id": "13","desc":"its 13","name":"kindle"}
]
}
我希望
id
成为我将其转储到文件后的第一个属性,但事实并非如此。我该如何解决这个问题呢?我猜这是因为你在使用字典(哈希映射)。这是不可忍受的。
你能做的是:
from collections import OrderedDict
data = OrderedDict()
data['list'] = OrderedDict()
data['list']['one'] = OrderedDict()
data['list']['one']['id'] = '12'
data['list']['one']['idesc'] = ...
data['list']['two'] = ...
这使得它按输入顺序排序。
知道dict/hashmap的输出是“不可能的”,因为传统词典的性质(和速度)使得排序/访问顺序因用法、词典中的项目和许多其他因素而有所不同。
因此,您需要在将字典发送到json之前将其传递给sort()
函数,或者使用名为orderedict
的较慢版本的字典(见上文)
非常感谢@MarcoNawijn检查JSON的源代码,不支持字典的排序结构,这意味着您必须自己构建JSON字符串
如果JSON字符串另一端的解析器遵守该顺序(我对此表示怀疑),则可以将其传递给一个函数,该函数为您的
orderedict
构建常规文本字符串表示,并根据JSON标准格式化字符串。然而,这将比我现在占用更多的时间,因为我不能100%确定JSON字符串的RFC。您不应该担心JSON的保存顺序。倾倒时,订单将被更改。最好也看看这些。
和
请向我们展示您将此JSON转储到文件中的代码。这不起作用
json.dump(..)
不遵守添加键/值对的顺序。您可以在交互式解释器中轻松地检查这一点。json.dump(..)
函数确实有一个sort\u keys
属性,但是您不能提供自定义排序函数(据我所知,不看它的实际实现)。如果id
属性的实际位置很重要,我建议使用sort\u key
属性。id
属性将至少位于一致/可预测的位置。因此,我检查了json.dump(..)
的实现。它确实对排序函数进行了硬编码,以便按以下键进行排序:sorted(dct.items(),key=lambda kv:kv[0])
@MarcoNawijn感谢您的解释。我不认为json硬编码了排序顺序。考虑到JSON被定义为在输出端没有特定顺序,我不明白为什么这是一个相关的问题,即使用户面临的问题让我很好奇:)