Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

json.dumps messes up order

Tags:

python

json

I'm working with the json module creating a json file containing entries of the like

json.dumps({"fields": { "name": "%s", "city": "%s", "status": "%s", "country": "%s" }}) 

However, in the json-file created the fields are in the wrong order

{"fields": {"status": "%s", "city": "%s", "name": "%s", "country": "%s"}} 

which is a problem because the substitions for the %s-strings are now incorrect.

How can I force the dumps function to keep the given order?

like image 446
TheWaveLad Avatar asked May 10 '15 14:05

TheWaveLad


People also ask

Does JSON dump change order?

json. dump() will preserve the ordder of your dictionary. Open the file in a text editor and you will see. It will preserve the order regardless of whether you send it an OrderedDict.

Does JSON loads preserve order?

loads() doesn't keep order [duplicate] Bookmark this question. Show activity on this post.

Are JSON Dicts ordered?

Dictionary doesn't have any order. @Nirav D, ordering is useful when JSON data is serialized and deserialized into a dictionary. Since the dictionary has no order, then you might end up writing a lot of different JSON strings even when coming from the same dict.

What is the difference between JSON dump and JSON dumps?

json. dump() method used to write Python serialized object as JSON formatted data into a file. json. dumps() method is used to encodes any Python object into JSON formatted String.


1 Answers

Like the other answers correctly state, before Python 3.6, dictionaries are unordered.

That said, JSON is also supposed to have unordered mappings, so in principle it does not make much sense to store ordered dictionaries in JSON. Concretely, this means that upon reading a JSON object, the order of the returned keys can be arbitrary.

A good way of preserving the order of a mapping (like a Python OrderedDict) in JSON is therefore to output an array of (key, value) pairs that you convert back to an ordered mapping upon reading:

>>> from collections import OrderedDict >>> import json >>> d = OrderedDict([(1, 10), (2, 20)])                                          >>> print d[2] 20 >>> json_format = json.dumps(d.items())                    >>> print json_format  # Order maintained [[1, 10], [2, 20]] >>> OrderedDict(json.loads(json_format))  # Reading from JSON: works! OrderedDict([(1, 10), (2, 20)]) >>> _[2]  # This works! 20 

(Note the way the ordered dictionary is constructed from a list of (key, value) pairs: OrderedDict({1: 10, 2: 20}) would not work: its keys are not necessarily ordered as in the dictionary literal, since the literal creates a Python dictionary whose keys are unordered.)

PS: Starting with Python 3.1, the json modules offers a hook for automatically converting a list of pairs (like above) to something else like an OrderedDict.

like image 69
Eric O Lebigot Avatar answered Sep 21 '22 07:09

Eric O Lebigot