skip to Main Content

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?

2

Answers


  1. 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.

    Login or Signup to reply.
  2. Here’s a variable-free jq solution:

    to_entries | sort_by(.key) | from_entries
    

    It is also worth noting that gojq, the Go implementation of jq, currently always sorts the keys within all JSON objects.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search