在jq中组合并重命名多个对象

时间:2019-02-28 15:49:03

标签: json jq

我从一个包含多个对象的JSON文件开始

{
  "name": "foo",
  "url": "https://zombo.com"
}
{
  "name": "bar",
  "url": "https://acme.com"
}

并且我正在尝试将这些结合到一个对象中,并以name属性为键:

{
  "widgets": {
    "foo": {
      "url": "https://zombo.com"
    },
    "bar": {
      "url": "https://acme.com"
    }
  }
}

一段时间以来,我一直对此感到头疼,我认为我与以下查询相当接近:

{ widgets: (reduce . as $item ({}; . + {($item.name): {url: $item.url}})) }

但是,这会导致多个对象,而我的想法也用光了。

jqplay在这里可用:https://jqplay.org/s/SI7XEMb5l9

2 个答案:

答案 0 :(得分:4)

我会像this那样做:

jq -s '{ widgets: map( { (.name): {url} } ) | add }'
  • -s--slurp)将对象合并为对象数组
  • map( { (.name): { url } } )重塑每个对象
  • add将数组元素串联为单个对象
  • 最后,我使用{ widgets: ... }构建对象。

答案 1 :(得分:2)

reduceinputs一起使用:

jq -n '{ widgets : (reduce inputs as $p ({}; . + ($p | { (.name) : { url } }))) }' file