使用 jq filter 或 jq play 将所有键值对组合成一个

Combining all key value pairs in one using jq filter or jq play

我想使用 jq 过滤器JSON 转换数据

Json数据:

{
 "main": [
  {
   "firstKey": "ABCD",
   "id": "12345",
   "data": [
    {
     "name": "first_id",
     "value": "first_id_value"
    },
    {
     "name": "second_id",
     "value": "second_id_value"
    },
    {
     "name": "third_id",
     "value": "third_id_value"
    }
   ]
  }
 ]
}

预期输出

{
 "firstKey": "ABCD",
 "id": "12345",
 "data.name.first_id": "first_id_value",
 "data.name.second_id": "second_id_value",
 "data.name.third_id": "third_id_value"
}

经过多次试验和错误,我使用以下过滤器表达式接近预期输出

[.main[]|{"firstKey", "id"},foreach .data[] as $item (0; "data.name.\($item.name)" as $a|$item.value as $b| {($a): $b})][]

使用 foreach 作为 “数据”下的对象是动态的。对象的数量可以不同。 上述表达式的输出是:

{
  "firstKey": "ABCD",
  "id": "12345"
}
{
  "data.name.first_id": "first_id_value"
}
{
  "data.name.second_id": "second_id_value"
}
{
  "data.name.third_id": "third_id_value"
}

但我希望 数据对象与 'firstKey' 和 'id'.

位于相同的大括号

LINK to JqPlay

任何建议都会有所帮助。

由于你的结构是如此严格,你可以作弊并使用内置的 from_entries,它采用 {key, value} 对的列表并构造一个对象:

.main[] |
{firstKey, id} +
  (.data | map({key: "data.name.\(.name)", value}) |
   from_entries)