好的,所以我可以在中使用OrderedDict json.dump
。也就是说,OrderedDict可以用作JSON的输入。
但是可以用作输出吗?如果可以,怎么办?就我而言,我想load
放入OrderedDict,以便可以将键的顺序保留在文件中。
如果没有,是否有某种解决方法?
json.load
以使用OrderedDicts而不是Python中的Dicts,那就太好了。
好的,所以我可以在中使用OrderedDict json.dump
。也就是说,OrderedDict可以用作JSON的输入。
但是可以用作输出吗?如果可以,怎么办?就我而言,我想load
放入OrderedDict,以便可以将键的顺序保留在文件中。
如果没有,是否有某种解决方法?
json.load
以使用OrderedDicts而不是Python中的Dicts,那就太好了。
Answers:
是的你可以。通过指定JSONDecoder的object_pairs_hook
参数。实际上,这是文档中给出的确切示例。
>>> json.JSONDecoder(object_pairs_hook=collections.OrderedDict).decode('{"foo":1, "bar": 2}')
OrderedDict([('foo', 1), ('bar', 2)])
>>>
您可以将此参数传递给json.loads
(如果不需要出于其他目的的Decoder实例),如下所示:
>>> import json
>>> from collections import OrderedDict
>>> data = json.loads('{"foo":1, "bar": 2}', object_pairs_hook=OrderedDict)
>>> print json.dumps(data, indent=4)
{
"foo": 1,
"bar": 2
}
>>>
使用json.load
以相同的方式完成:
>>> data = json.load(open('config.json'), object_pairs_hook=OrderedDict)
object_pairs_hook
,而不是“每个对将传递给object_pairs_hook”,
OrderedDict
都会使用该JSON 建立最终的python值。
适用于Python 2.7+的简单版本
my_ordered_dict = json.loads(json_str, object_pairs_hook=collections.OrderedDict)
或适用于Python 2.4至2.6
import simplejson as json
import ordereddict
my_ordered_dict = json.loads(json_str, object_pairs_hook=ordereddict.OrderedDict)
simplejson
,ordereddict
它们是需要安装的独立库。
loads('{}', object_pairs_hook=OrderedDict)
。
一些好消息!从3.6版开始,cPython实现保留了字典的插入顺序(https://mail.python.org/pipermail/python-dev/2016-September/146327.html)。这意味着json库现在默认保留顺序。观察python 3.5和3.6之间的行为差异。编码:
import json
data = json.loads('{"foo":1, "bar":2, "fiddle":{"bar":2, "foo":1}}')
print(json.dumps(data, indent=4))
在py3.5中,结果顺序是不确定的:
{
"fiddle": {
"bar": 2,
"foo": 1
},
"bar": 2,
"foo": 1
}
在python 3.6的cPython实现中:
{
"foo": 1,
"bar": 2,
"fiddle": {
"bar": 2,
"foo": 1
}
}
真正的好消息是,这已成为python 3.7的语言规范(与cPython 3.6+的实现细节相反):https ://mail.python.org/pipermail/python-dev/2017-December/151283 .html
因此,您的问题的答案现在变成:升级到python 3.6!:)
json.loads('{"2": 2, "1": 1}')
变得如此{'1': 1, '2': 2}
。
dict.__repr__
键进行排序,同时保留了基本顺序。换句话说,json.loads('{"2": 2, "1": 1}').items()
就是dict_items([('2', 2), ('1', 1)])
即使repr(json.loads('{"2": 2, "1": 1}'))
是"{'1': 1, '2': 2}"
。
除了转储字典,您总是可以写出密钥列表,然后OrderedDict
通过遍历列表来重建密钥?
OrdereDict
s 递归完成重建。