This question already has an answer here:
-
Items in JSON object are out of order using “json.dumps”?
6 answers
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
?
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.
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
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.
This not problem with simplejson
, its the behavior of dict
in python. dict
s 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"}
]