jq - 将对象列表转换为汇总对象

时间:2017-11-29 11:07:26

标签: arrays json jq

我有这样的JSON数据:

[
  {
    "tone_id": "anger",
    "score": 0.012,
    "tone_name": "Anger"
  },
  {
    "tone_id": "disgust",
    "score": 0.002,
    "tone_name": "Disgust"
  },
  {
    "tone_id": "fear",
    "score": 0.14,
    "tone_name": "Fear"
  },
  {
    "tone_id": "joy",
    "score": 0.42,
    "tone_name": "Joy"
  }
]

我想使用 jq 将其转换为以下内容:

{
  "anger": 0.012,
  "disgust": 0.002,
  "fear": 0.14,
  "joy": 0.42
}

我能做的最好的事情是:

cat result.json | jq '.[] | { (.tone_id): .score }'

给出了以下内容:

{
  "anger": 0.012
}
{
  "disgust": 0.002
}
{
  "fear": 0.14
}
{
  "joy": 0.42
}
  

我知道我可以使用其他方法轻松完成此操作。只是想知道是否可以使用 jq 单行?

2 个答案:

答案 0 :(得分:6)

单一调用单行:

 jq 'map( {(.tone_id): .score} ) | add'

(在传递给.[] | { (.tone_id): .score }之前,你也可以在add周围包括方括号 - 这两种方法是等价的。)

答案 1 :(得分:0)

您可以使用from_entries

jq '[.[] | {key: .tone_id, value: .score}] | from_entries' tmp.json
# or jq 'map({key: .tone_id, value: .score}) | from_entries' tmp.json

虽然在这种情况下,我没有看到任何建议通过@ peak' add解决方案。