simplejson不按顺序返回值

时间:2013-07-22 13:52:24

标签: python django json simplejson

在Django中使用simplejson时,我有时需要严格按顺序发送信息。

values = {"entry1":"value1","entry2":"value2","entry3":"value3"}
return HttpResponse(simplejson.dumps(values),content_type="application/json")

这就是它返回的内容

{"entry2": "value2", "entry3": "value3", "entry1": "value1"}

但是我希望它能够返回这个:

{"entry1":"value1","entry2":"value2","entry3":"value3"}

如何在simplejson中按顺序发送信息?

4 个答案:

答案 0 :(得分:3)

我有时需要严格按顺序发送信息。不要使用字典,使用元组列表:

values = [("entry1", "value1"), ("entry2", "value2"), ("entry3", "value3")]

字典 JSON对象没有设置顺序。既不会保留您的输入订单,也不会要求它们。

引用JSON RFC

  

对象是零个或多个名称/值对的无序集合[...]

和Python dict.items()文档:

  

键和值以任意顺序列出,这是非随机的,在Python实现中各不相同,并且取决于字典的插入和删除历史。

答案 1 :(得分:2)

解决这个问题的传统方法是使用Martjin Pieters建议的二维元组/列表。

更多的Pythonic方法是使用OrderedDict来实现这一点。

对于类似问题/解决方案,请参阅: Can I get JSON to load into an OrderedDict in Python?

有关OrderedDict文档,请参阅:http://docs.python.org/2/library/collections.html#collections.OrderedDict

答案 2 :(得分:1)

您可以在转储中使用sort_keys=True选项:

simplejson.dumps(values, sort_keys=True)

将按排序顺序打印出您的字典。但是,字典本质上是无序的,因此当您将字典作为参数提供给HttpResponse时,结果将不按顺序排列。

答案 3 :(得分:0)

simplejson这不是问题,它是python中dict的行为。 dict未订购,因此您无法真实地预测它们将以何种顺序出现。

您可以重新格式化数据,以便按顺序获取:

values = [ {"entry1":"value1"}, { "entry2":"value2"} ,{"entry3":"value3"} ]

values = [ {"key":"entry1", "value":"value1"},
           {"key":"entry2", "value":"value2"},
           {"key":"entry3", "value":"value3"}
         ]