在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
中按顺序发送信息?
我有时需要严格按顺序发送信息。
不要使用字典,使用元组列表:
values = [("entry1", "value1"), ("entry2", "value2"), ("entry3", "value3")]
Dictionaries和JSON对象没有设置顺序。既不会保留您的输入订单,也不需要它们。
引用JSON RFC:
对象是零个或多个名称/值对的无序集合〔…〕
和Python dict.items()
文档:
键和值以非随机的任意顺序列出,在Python实现中有所不同,并且取决于字典的插入和删除历史。
解决此问题的传统方法是使用二维元组/列表,正如Martjin Pieters所建议的那样。
然而,实现这一点的更Python的方法是使用OrderedDict。
有关类似问题/解决方案,请参阅:我可以让JSON加载到Python中的OrderedDict中吗?
有关OrderedDict文档,请参阅:http://docs.python.org/2/library/collections.html#collections.OrderedDict
您可以在转储中使用sort_keys=True
选项:
simplejson.dumps(values, sort_keys=True)
它会按顺序打印出你的字典和关键字。然而,字典本质上是无序的,所以当您将字典作为参数提供给HttpResponse
时,结果不会是有序的。
这不是simplejson
的问题,它是dict
在python中的行为。dict
没有排序,所以你无法真正预测它们的顺序。
您可以重新格式化您的数据以按顺序获得:
values = [ {"entry1":"value1"}, { "entry2":"value2"} ,{"entry3":"value3"} ]
或
values = [ {"key":"entry1", "value":"value1"},
{"key":"entry2", "value":"value2"},
{"key":"entry3", "value":"value3"}
]