【问题标题】:Combining all key value pairs in one using jq filter or jq play使用 jq 过滤器或 jq play 将所有键值对组合在一起
【发布时间】:2021-12-30 05:32:42
【问题描述】:

我想使用 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

任何建议都会有所帮助。

【问题讨论】:

    标签: json foreach jq


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多