fog
fog

Reputation: 43

Sorting a JSON Object

I'm new to JSON and Python, and I'm attempting to load a json file that I created from disk to manipulate and output to an xml file. I've gotten most of it figured out, except, I want to 'sort' the JSON file after I load it by a certain value.

Example of json file:

{
   "0" : {
     "name": "John Doe",
     "finished": "4",
     "logo": "http://someurl.com/icon.png"
   },
   "1" : {
     "name": "Jane Doe",
     "finished": "10",
     "logo": "http://anotherurl.com/icon.png"
   },
   "2" : {
     "name": "Jacob Smith",
     "finished": "3",
     "logo": "http://example.com/icon.png"
   }
}

What I want to do is sort 'tree' by the 'finished' key.

JSONFILE = "file.json"

with open(CHANS) as json_file:
    tree = json.load(json_file)

Upvotes: 0

Views: 2140

Answers (1)

Depends on how do you "consume" the tree dictionary. are you using tree.keys(), tree.values() or tree.items()?

tree.keys()

ordered_keys = sorted(tree.keys(), key=lambda k: int(tree[k]['finished']))

tree.values()

ordered_keys = sorted(tree.values(), key=lambda v: int(v['finished']))

tree.items()

ordered_keys = sorted(tree.items(), key=lambda t: int(t[1]['finished']))

You only keep in mind that JSON is what's inside the actual file, the result of json.load() is just a Python value/object, so just work with them.

If you are walking over the sorted dictionary once, the above snippets will work just fine. However if you need to access it multiple times, then I would follow ~Jean-François suggestion and use OrderedDict, with something like:

from collections import OrderedDict
tree = OrderedDict(sorted(tree.items(), key=lambda t: int(t[1]['finished'])))

That way the sorting operation (arguably the most expensive) is done just once.

Upvotes: 1

Related Questions