如何使用jq将指定嵌套JSON转换为目标键值对格式?
解决jq转换JSON结构的问题
你的需求是将包含objects数组的原始JSON,转换为以设备标识(如gate01)为顶级键,内部以统计项ID为键、对应数值为值的结构。
你之前的命令问题在于:同时对.statistics[].id和.statistics[].value做数组展开,这会生成笛卡尔积,导致每个ID和所有数值错误配对,完全不符合预期。
正确的jq命令
方法一:用from_entries快速转换统计数组
这是最简洁的实现方式,先把每个统计项转成{key: .id|tostring, value: .value}的标准格式,再用from_entries将数组直接转为对象:
jq '.objects | map({key: .key, value: .statistics | map({key: .id|tostring, value: .value}) | from_entries}) | from_entries'
方法二:用reduce手动构建统计对象
如果需要更精细的控制逻辑,可以用reduce遍历每个统计项,逐步构建目标对象:
jq '.objects | map({(.key): reduce .statistics[] as $s ({}; . + {($s.id|tostring): $s.value})}) | add'
验证效果
用你的输入数据运行上述任一命令,都会得到你期望的输出:
{ "gate01": { "18": 0.0, "89": 0, "91": 35.0, "20": 33.0 }, "gate02": { "18": 1.0, "89": 24290.0, "91": 110.0, "20": 97.0 } }
内容的提问来源于stack exchange,提问作者Martial
相关产品推荐
相关产品推荐

