Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

custom JSON sort_keys order in Python

Is there any way in Python 2.6 to supply a custom key or cmp function to JSON's sort_keys?

I've got a list of dicts coming from JSON like so:

[
  {
    "key": "numberpuzzles1",
    "url": "number-puzzle-i.html",
    "title": "Number Puzzle I",
    "category": "nestedloops",
    "points": "60",
    "n": "087"
  },
  {
     "key": "gettingindividualdigits",
     "url": "getting-individual-digits.html",
     "title": "Getting Individual Digits",
     "category": "nestedloops",
     "points": "80",
     "n": "088"
  }
]

...which I've stored into the list variable assigndb. I'd like to be able to load in the JSON, modify it, and serialized it back out with dumps (or whatever), keeping the orders of the keys intact.

So far, I've tried something like this:

ordering = {'key': 0, 'url': 1, 'title': 2, 'category': 3,
             'flags': 4, 'points': 5, 'n': 6}

def key_func(k):
    return ordering[k]

# renumber assignments sequentially
for (i, a) in enumerate(assigndb):
    a["n"] = "%03d" % (i+1)

s = json.dumps(assigndb, indent=2, sort_keys=True, key=key_func)

...but of course dumps doesn't support a custom key like list.sort() does. Something with a custom JSONEncoder maybe? I can't seem to get it going.

like image 788
Graham Mitchell Avatar asked Dec 09 '10 19:12

Graham Mitchell


People also ask

How do you arrange JSON in Python?

Using json. dumps() function is one way to sort the JSON object. It is used to convert the array of JSON objects into a sorted JSON object. The value of the sort_keys argument of the dumps() function will require to set True to generate the sorted JSON objects from the array of JSON objects.

How do I sort a JSON key?

Enter your JSON into the first text area, or drag and drop a file, after, select the sort method you're going to use, key value requires the key name (if not specified selects the first key), click the example button to get an idea on how it works. The result will automatically sort and display in the output text area.

Does JSON loads preserve order?

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


1 Answers

An idea (tested with 2.7):

import json
import collections
json.encoder.c_make_encoder = None
d = collections.OrderedDict([("b", 2), ("a", 1)])
json.dumps(d)
# '{"b": 2, "a": 1}'

See: OrderedDict + issue6105. The c_make_encoder hack seems only to be needed for Python 2.x. Not a direct solution because you have to change dicts for OrderedDicts, but it may be still usable. I checked the json library (encode.py) and the ordered is hardcoded:

if _sort_keys:
    items = sorted(dct.items(), key=lambda kv: kv[0])
like image 195
tokland Avatar answered Sep 20 '22 06:09

tokland