Items in JSON object are out of order using "json.dumps"?

json, python

Solution

Both Python `dict` (before Python 3.7) and JSON object are unordered collections. You could pass `sort_keys` parameter, to sort the keys:

>>> import json
>>> json.dumps({'a': 1, 'b': 2})
'{"b": 2, "a": 1}'
>>> json.dumps({'a': 1, 'b': 2}, sort_keys=True)
'{"a": 1, "b": 2}'

If you need a particular order; you could use `collections.OrderedDict`:

>>> from collections import OrderedDict
>>> json.dumps(OrderedDict([("a", 1), ("b", 2)]))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict([("b", 2), ("a", 1)]))
'{"b": 2, "a": 1}'

Since Python 3.6, the keyword argument order is preserved and the above can be rewritten using a nicer syntax:

>>> json.dumps(OrderedDict(a=1, b=2))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict(b=2, a=1))
'{"b": 2, "a": 1}'

See PEP 468 – Preserving Keyword Argument Order.

If your input is given as JSON then to preserve the order (to get `OrderedDict`), you could pass `object_pair_hook`, as suggested by @Fred Yankowski:

>>> json.loads('{"a": 1, "b": 2}', object_pairs_hook=OrderedDict)
OrderedDict([('a', 1), ('b', 2)])
>>> json.loads('{"b": 2, "a": 1}', object_pairs_hook=OrderedDict)
OrderedDict([('b', 2), ('a', 1)])

Problem

I'm using `json.dumps` to convert into json like ``` countries.append({"id":row.id,"name":row.name,"timezone":row.timezone}) print json.dumps(countries) ``` The result i have is: ``` [ {"timezone": 4, "id": 1, "name": "Mauritius"}, {"timezone": 2, "id": 2, "name": "France"}, {"timezone": 1, "id": 3, "name": "England"}, {"timezone": -4, "id": 4, "name": "USA"} ] ``` I want to have the keys in the following order: id, name, timezone - but instead I have timezone, id, name. How should I fix this?

Original source