如何使用jq filter将嵌套JSON数据转换为包含扁平化data字段的单一对象?
解决JQ将嵌套数组转换为平级键值对并合并到同一对象的问题
我来帮你搞定这个问题!你当前的filter生成了多个独立对象,我们只需要把data数组处理成一个单对象,再和包含firstKey、id的原对象合并就能得到想要的结果。
输入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" }
可行的JQ Filter
.main[] | . + (.data | reduce .[] as $item ({}; .["data.name.\($item.name)"] = $item.value))
分步解释
.main[]:取出main数组中的单个对象(即使main里有多个元素,这个写法也能批量处理)。.data | reduce .[] as $item ({}; ...):遍历data数组,把每个item转换成键为data.name.xxx、值为对应value的键值对,最终合并成一个完整对象:- 初始值
{}是一个空对象,作为迭代的起点 - 每次迭代给空对象添加新的键值对:
.["data.name.\($item.name)"] = $item.value
- 初始值
+:把原对象(包含firstKey和id)和上面生成的平级键值对对象合并,得到最终的单对象结果。
这个方法完美适配data数组数量动态变化的场景,不管里面有多少个item,都会被转换成对应的平级键值对并合并到同一对象中。
内容的提问来源于stack exchange,提问作者Chirag Sheth
相关产品推荐
相关产品推荐

