如何将json字符串转换为字典并在键中保存顺序?

时间:2012-04-18 09:49:20

标签: python json

当我想将json字符串转换为Python字典时,我遇到了问题。我有像

这样的字符串
 s={"name":{"Saban:Saulic"},"price":{"koncert:1000"} ....}

当我写

之类的东西时
tags=json.loads(s)

我gtet字典但键的顺序与字符串不一样(它不是名字,价格......)。如何将json字符串转换为字典并在键中保存顺序?

1 个答案:

答案 0 :(得分:22)

Python 2.7 OrderedDict以来collections

collections.OrderedDict()个模块

这种字典保留了元素的插入顺序。

来自Python文档:

  

json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

     

反序列化fp(.read() - 支持包含文件的文件对象   JSON文档)到Python对象。

     

如果fp的内容是用基于ASCII的编码编码的话   如果是UTF-8(例如latin-1),则必须使用适当的编码名称   指定。不是基于ASCII的编码(例如UCS-2)不是   允许,并且应该用codecs.getreader(encoding)(fp)包装,或者   简单地解码为unicode对象并传递给loads()。

     

object_hook是一个可选函数,将使用它调用   任何对象文字解码的结果(一个字典)。的返回值   将使用object_hook而不是dict。可以使用此功能   实现自定义解码器(例如JSON-RPC类提示)。

     

object_pairs_hook是一个可选函数,将使用它调用   任何对象文字的结果用对的有序列表解码。   将使用object_pairs_hook的返回值而不是   字典。此功能可用于实现依赖的自定义解码器   按键和值对的顺序解码(例如,   collections.OrderedDict()将记住插入的顺序)。如果   object_hook也被定义,object_pairs_hook优先。

我认为您可以将object_pairs_hook参数与{{3}}

一起使用
tags=json.loads(s, object_pairs_hook=collections.OrderedDict)