20

I've got a file that contains a JSON object. It's been loaded the following way:

with open('data.json', 'r') as input_file:
  input_data = input_file.read()

At this point input_data contains just a string, and now I proceed to parse it into JSON:

data_content = json.loads(input_data.decode('utf-8'))

data_content has the JSON representation of the string which is what I need, but for some reason not clear to me after json.loads it is altering the order original order of the keys, so for instance, if my file contained something like:

{ "z_id": 312312,
  "fname": "test",
  "program": "none",
  "org": null
}

After json.loads the order is altered to let's say something like:

{ "fname": "test",
  "program": None,
  "z_id": 312312,
  "org": "none"
}

Why is this happening? Is there a way to preserve the order? I'm using Python 2.7.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Sebastian
  • 845
  • 4
  • 12
  • 25

2 Answers2

34

Dictionaries (objects) in python have no guaranteed order. So when parsed into a dict, the order is lost.

If the order is important for some reason, you can have json.loads use an OrderedDict instead, which is like a dict, but the order of keys is saved.

from collections import OrderedDict

data_content = json.loads(input_data.decode('utf-8'), object_pairs_hook=OrderedDict)
gen_Eric
  • 223,194
  • 41
  • 299
  • 337
  • 8
    [Since Python 3.7 `json.loads` preserves dict order by default.](https://stackoverflow.com/questions/6921699/can-i-get-json-to-load-into-an-ordereddict) – user202729 Nov 04 '20 at 13:59
3

This is not an issue with json.load. Dictionaries in Python are not order enforced, so you will get it out of order; generally speaking, it doesn't matter, because you access elements based on strings, like "id".

Neil
  • 14,063
  • 3
  • 30
  • 51
  • 5
    It does matter in this case since I gotta dump the data into an excel file and need preserve the structure. All my files will not have the same structure so cannot access each element individually – Sebastian May 04 '17 at 17:53