如何使用JQ将JSON数组转换为指定结构的对象?
正确的JQ语句实现JSON数组合并转换
核心JQ命令
group_by([.PartNumber, .ClassificationNo]) | map( { PartNumber: .[0].PartNumber, ClassificationNo: .[0].ClassificationNo } + (reduce .[] as $item ({}; .[$item.Field] = $item.StringValue)) )
命令解析
- 分组:
group_by([.PartNumber, .ClassificationNo])将原数组中拥有相同PartNumber和ClassificationNo的对象归为同一组,确保后续只处理同组内的合并逻辑。 - 构造目标对象:
- 先提取分组内首个对象的
PartNumber和ClassificationNo(同组内这两个字段值完全一致),作为基础对象。 - 使用
reduce遍历分组内的每个对象,将Field的值作为键、StringValue的值作为值,逐步合并到一个空对象中。 - 最后用
+运算符将基础对象和合并后的键值对对象整合,得到最终的单条记录。
- 先提取分组内首个对象的
示例验证
输入JSON
[ { "PartNumber": "PN001", "ClassificationNo": "CLS001", "StringValue": "红色", "Field": "Color" }, { "PartNumber": "PN001", "ClassificationNo": "CLS001", "StringValue": "100", "Field": "Quantity" }, { "PartNumber": "PN002", "ClassificationNo": "CLS002", "StringValue": "蓝色", "Field": "Color" } ]
输出JSON
[ { "PartNumber": "PN001", "ClassificationNo": "CLS001", "Color": "红色", "Quantity": "100" }, { "PartNumber": "PN002", "ClassificationNo": "CLS002", "Color": "蓝色" } ]
原命令问题说明
你之前使用的| .[] | [.PartNumber, .ClassificationNo, .StringValue, .Field]只是将每个对象拆解为数组元素,没有实现分组和键值对合并的逻辑,因此无法得到目标结构。
内容的提问来源于stack exchange,提问作者shepi
相关产品推荐
相关产品推荐

