simplejson returns values not in order [duplicate]

2019-08-06 04:57发布

This question already has an answer here:

When working with simplejson in Django, I sometimes need to send the information strictly in order.

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

That's what it returns

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

But I want it to returns this instead:

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

How can I send the information in order in simplejson?

4条回答
【Aperson】
2楼-- · 2019-08-06 05:38

You can use the sort_keys=True option in dumps:

simplejson.dumps(values, sort_keys=True)

which will print out your dictionary with the keys in sorted order. However, dictionaries are inherently unordered, so when you give the dictionary as a parameter to HttpResponse, the results won't be in order.

查看更多
相关推荐>>
3楼-- · 2019-08-06 05:39

The traditional way of solving this issue is by using 2-dimensional tuple/list, as suggested by Martjin Pieters.

The more Pythonic way of accomplishing this is by using OrderedDict, however.

For similar question/solution see: Can I get JSON to load into an OrderedDict in Python?

For OrderedDict documentation see: http://docs.python.org/2/library/collections.html#collections.OrderedDict

查看更多
Luminary・发光体
4楼-- · 2019-08-06 05:46

I sometimes need to send the information strictly in order. Don't use a dictionary then, use a list of tuples:

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

Dictionaries and JSON objects do not have a set order. Neither will preserve your input order, nor are they required to.

To quote the JSON RFC:

An object is an unordered collection of zero or more name/value pairs [...]

and the Python dict.items() documentation:

Keys and values are listed in an arbitrary order which is non-random, varies across Python implementations, and depends on the dictionary’s history of insertions and deletions.

查看更多
\"骚年 ilove
5楼-- · 2019-08-06 05:47

This not problem with simplejson, its the behavior of dict in python. dicts are not ordered, so you can't really predict in what order they will come.

You can reformat your data to get that in order as:

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

or

values = [ {"key":"entry1", "value":"value1"},
           {"key":"entry2", "value":"value2"},
           {"key":"entry3", "value":"value3"}
         ]
查看更多
登录 后发表回答