我可以在json。dump中使用OrderedDict。也就是说,OrderedDict可以用作JSON的输入。
但它能被用作输出吗?如果是,怎么做?在我的情况下,我想加载到OrderedDict,这样我就可以保持文件中键的顺序。
如果不是,有没有什么解决办法?
我可以在json。dump中使用OrderedDict。也就是说,OrderedDict可以用作JSON的输入。
但它能被用作输出吗?如果是,怎么做?在我的情况下,我想加载到OrderedDict,这样我就可以保持文件中键的顺序。
如果不是,有没有什么解决办法?
当前回答
如果你指定了object_pairs_hook参数,通常使用的load命令将正常工作:
import json
from collections import OrderedDict
with open('foo.json', 'r') as fp:
metrics_types = json.load(fp, object_pairs_hook=OrderedDict)
其他回答
除了转储字典之外,您总是可以写出键的列表,然后通过遍历列表重新构造OrderedDict ?
除了在字典旁边转储键的有序列表外,另一个低技术含量的解决方案(具有显式的优点)是转储键-值对的有序列表ordered_dict.items();加载是一个简单的OrderedDict(<键值对列表>)。这处理了一个有序字典,尽管JSON没有这个概念(JSON字典没有顺序)。
利用json以正确的顺序转储OrderedDict这一事实确实很好。然而,作为OrderedDict(通过object_pairs_hook参数)读取所有JSON字典通常是不必要的沉重,也没有必要的意义,因此仅显式转换必须排序的字典也是有意义的。
如果你指定了object_pairs_hook参数,通常使用的load命令将正常工作:
import json
from collections import OrderedDict
with open('foo.json', 'r') as fp:
metrics_types = json.load(fp, object_pairs_hook=OrderedDict)
是的,你可以。通过将object_pairs_hook参数指定给JSONDecoder。事实上,这正是文档中给出的示例。
>>> json.JSONDecoder(object_pairs_hook=collections.OrderedDict).decode('{"foo":1, "bar": 2}')
OrderedDict([('foo', 1), ('bar', 2)])
>>>
你可以把这个参数传递给json。加载(如果你不需要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。加载的方式相同:
>>> data = json.load(open('config.json'), object_pairs_hook=OrderedDict)
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)