Felix Dombek
Felix Dombek

Reputation: 14372

How can I get a single result object in jq?

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?

Upvotes: 1

Views: 101

Answers (3)

knittl
knittl

Reputation: 265231

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

Upvotes: 2

pmf
pmf

Reputation: 36088

Here's an approach using reduce which iteratively builds up the result object:

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

Demo

Upvotes: 2

Inian
Inian

Reputation: 85590

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

.cases | map({ "\(.id)" : .count }) | add

Upvotes: 3

Related Questions