2012-04-18 49 views
8

我想要将json字符串转换为Python字典时遇到问题。我有串状如何将json字符串转换为字典并在键中保存顺序?

s={"name":{"Saban:Saulic"},"price":{"koncert:1000"} ....} 

时,我喜欢写东西

tags=json.loads(s) 

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

+2

Python字典是无序的,因为通常你访问的条目*者皆*这是很好的,如果你有遍历元素时,订单通常并不重要。顺便说一句,'s'既不是字符串,也不是字典,如果它是一个字符串,则无效。它看起来像是在一个不同的结构之后,比如一组对象:'[{“name”:“...”,“price”:“...”},...]'。如果你提供了一些解释*为什么*你需要按顺序键并提供一个正确的例子,那么我们可以帮助你更好。 – 2012-04-18 09:51:30

+0

在'dict'中并没有真正的“按键顺序”这样的事情。你可以一次迭代它们,但是不能控制你得到它们的顺序。 – 2012-04-18 10:05:39

+3

我认为[this previous](http:// stackoverflow。com/questions/6921699/can-i-get -json-to-load-into-an-ordereddict-in-python)Stackoverflow的问题提供了一个答案。 – Alvin 2012-04-18 10:06:43

回答

21

由于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的内容被与其他 比UTF-8的基于ASCII编码的(例如拉丁-1),则必须 指定适当的编码名称。不是基于ASCII的编码(例如UCS-2)不允许使用 ,应使用codecs.getreader(encoding)(fp)或 将其封装为简单解码为unicode对象并传递给loads()。

object_hook是一个可选函数,将使用任何对象字面解码(字典)的 结果调用。将使用返回值 object_hook而不是字典。这个特性可以用 来实现自定义解码器(例如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) 
相关问题