如何将json字符串转换为字典并在键中保存顺序? [复制]
Posted
技术标签:
【中文标题】如何将json字符串转换为字典并在键中保存顺序? [复制]【英文标题】:How to convert json string to dictionary and save order in keys? [duplicate] 【发布时间】:2012-04-29 17:13:43 【问题描述】:我想将 json 字符串转换为 Python 字典时遇到问题。我有像
这样的字符串 s="name":"Saban:Saulic","price":"koncert:1000" ....
当我写类似的东西时
tags=json.loads(s)
我 gtet 字典,但键的顺序与字符串中的顺序不同(它不是名称,价格......)。如何将 json 字符串转换为字典并在键中保存顺序?
【问题讨论】:
Python 字典是无序的,这很好,因为通常您按键 访问条目,如果您必须遍历元素,顺序通常无关紧要。顺便说一句,s
既不是字符串也不是字典,如果它是字符串,则不是有效的 JSON。看起来您正在使用不同的结构,例如对象数组:["name": "...", "price": "...", ...]
。如果您对为什么您需要按顺序使用密钥提供一些解释并提供正确的示例,那么我们可以为您提供更好的帮助。
dict
中并没有真正意义上的“键顺序”。您可以一次迭代一个,但无法控制获取它们的顺序。
我认为 *** 上的 this previous 问题提供了答案。
【参考方案1】:
因为Python 2.7 你有来自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 的编码编码 other 比 UTF-8(例如 latin-1),则必须使用适当的编码名称 指定的。不基于 ASCII 的编码(如 UCS-2)不是 允许,并且应该用 codecs.getreader(encoding)(fp) 包装,或者 只需解码为 unicode 对象并传递给 load()。
object_hook 是一个可选函数,将使用 任何对象文字解码的结果(字典)。的返回值 将使用 object_hook 代替 dict。可以使用此功能 实现自定义解码器(例如 JSON-RPC 类提示)。
object_pairs_hook 是一个可选函数,将使用 使用有序对列表解码的任何对象文字的结果。 将使用 object_pairs_hook 的返回值而不是 字典。此功能可用于实现依赖于的自定义解码器 根据键值对的解码顺序(例如, collections.OrderedDict() 会记住插入的顺序)。如果 object_hook 也定义了,object_pairs_hook 优先。
我认为您可以将 object_pairs_hook 参数与 collections.OrderedDict()
一起使用
tags=json.loads(s, object_pairs_hook=collections.OrderedDict)
【讨论】:
拯救了我的一天...以上是关于如何将json字符串转换为字典并在键中保存顺序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章