Sorting a JSON file by outer object name

I have a json file input.json thus:

{
   "foo":{
       "prefix":"abc",
       "body":[1,2,3]
   },
   "bar":{
       "prefix":"def",
       "body":[4,5,6]    
   }
}

I would like to sort it by the outer object names, with "bar" coming before "foo" in alphabetical order like so:

{
   "bar":{
       "prefix":"def",
       "body":[4,5,6]    
   },
   "foo":{
       "prefix":"abc",
       "body":[1,2,3]
   }
}

to produce file output.json.

Versions of this question have been asked of Java/Javascript (here and here)

Is there a way to accomplish this using a command line tool like sed/awk or boost.json?

>Solution :

Using jq, you could use the keys built-in to get the key names in sorted order and form the corresponding value object

jq 'keys[] as $k | { ($k) : .[$k] }' json

Note that jq does have a field --sort-keys option, which cannot be used here, as it internally sorts the inner level objects as well.

Leave a Reply