使用jq的map或from_entries格式化对象数组的技术求助
正确的jq写法实现JSON转换需求
原始输入JSON
{ "result": [ { "name": "Fields", "listFields": [ [ "apple" ], [ "Banana__c" ] ], "fields": [ { "name": "apple", "displayName": "Apple", "color": "red", "price": 20 }, { "name": "Banana__c", "displayName": "Banana", "color": "yellow", "price": 18 } ] } ], "success": true }
期望输出JSON
{ "fields": [ "apple", "Banana__c" ], "Brand": "Kroger", "fruitNames": { "apple": "Apple", "Banana__c": "Banana" } }
错误代码问题说明
你之前尝试的两段代码存在语法或逻辑错误:
- 第一段:对象构造时
fruitNames后缺少冒号,且未正确定位到.result数组内的元素,合并对象的语法不符合jq规范 - 第二段:生成的键名格式不符合需求,且未构建出目标结构的三个字段
正确jq代码及解释
写法一(map + add)
.result[] | { fields: [.fields[].name], Brand: "Kroger", fruitNames: (.fields | map({(.name): .displayName}) | add) }
写法二(reduce遍历构建)
.result[] | { fields: [.fields[].name], Brand: "Kroger", fruitNames: reduce .fields[] as $f ({}; .[$f.name] = $f.displayName) }
代码解释
.result[]:遍历外层result数组,取出数组内的目标对象fields: [.fields[].name]:从对象的fields数组中提取每个元素的name字段,组成新的数组Brand: "Kroger":直接添加固定值字段fruitNames字段:- 写法一中,先用
map将每个fields元素转换为{name: displayName}格式的单个对象,再用add合并成一个完整的键值对对象 - 写法二中,用
reduce遍历fields数组,初始化空对象,逐个将name作为键、displayName作为值存入对象
- 写法一中,先用
内容的提问来源于stack exchange,提问作者dreaminCode
相关产品推荐
相关产品推荐

