当我想将json字符串转换为Python字典时,我遇到了问题。我有像
这样的字符串 s={"name":{"Saban:Saulic"},"price":{"koncert:1000"} ....}
当我写
之类的东西时tags=json.loads(s)
我gtet字典但键的顺序与字符串不一样(它不是名字,价格......)。如何将json字符串转换为字典并在键中保存顺序?
答案 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)