如何使用jq正确转换指定JSON对象?现有尝试结果不符合预期
解决JSON转换的jq命令问题
原始JSON数据
{ "locals": { "products": { "core-tower1": { "core-tower1-product-a": ["dev"], "core-tower1-product-b": ["dev", "prod"] }, "core-tower2": { "core-tower2-product-a": ["pol", "onb"], "core-tower2-product-a": ["dev", "prod"] } } } }
目标转换格式
{ "core-tower1": [ "core-tower1-product-a", "core-tower1-product-b" ], "core-tower2": [ "core-tower2-product-a", "core-tower2-product-a" ] }
错误的jq命令及结果
你使用的命令:
jq {'(.locals.products|keys[])':'.locals.products|.[]|keys'}
得到的错误结果:
{ "core-tower1": [ "core-tower1-product-a", "core-tower1-product-b" ], "core-tower1": [ "core-tower2-product-a", "core-tower2-product-a" ] } { "core-tower2": [ "core-tower1-product-a", "core-tower1-product-b" ], "core-tower2": [ "core-tower2-product-a", "core-tower2-product-a" ] }
正确的jq写法
方法一:使用with_entries(推荐)
这是最简洁的写法,直接遍历并转换每个条目:
jq '.locals.products | with_entries({key: .key, value: (.value | keys)})'
方法二:显式遍历转换
如果需要更直观的步骤,可以用to_entries和from_entries组合:
jq '.locals.products | to_entries[] | {key: .key, value: .value | keys} | from_entries'
错误原因说明
你之前的命令逻辑错误:(.locals.products|keys[])会遍历所有tower的名称,但.locals.products|.[]|keys会取出所有tower下的产品key列表,导致每个tower名称都对应了所有产品的集合,最终生成重复且错误的映射。
而正确的写法是针对每个tower条目,单独提取它自身的产品key列表,确保一一对应。
内容的提问来源于stack exchange,提问作者Owen
相关产品推荐
相关产品推荐

