skip to Main Content

I have a JSON file like this:

{
    "cases": [
        {"id": "1", "count": 2, "ignore": "f"},
        {"id": "2", "count": 7, "ignore": "o"},
        {"id": "3", "count": 11, "ignore": "o"}
    ]
}

Doing jq '.cases[] | { "(.id)" : .count }' test.json gives

{
  "1": 2
}
{
  "2": 7
}
{
  "3": 11
}

but I need

{ 
  "1": 2, 
  "2": 7, 
  "3": 11 
}

How can I get there?

3

Answers


  1. You need to collect the results into an array and add them

    .cases | map({ "(.id)" : .count }) | add
    
    Login or Signup to reply.
  2. from_entries sounds like the obvious choice. First map your input array to an array of key-value pairs, then construct an object from this array:

    .cases | map({ key: .id, value: .count }) | from_entries
    
    Login or Signup to reply.
  3. Here’s an approach using reduce which iteratively builds up the result object:

    reduce .cases[] as {$id, $count} ({}; .[$id] = $count)
    

    Demo

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