使用JQ扁平化转换动态JSON:拆分stats下value键值为独立对象
实现目标的JQ方案
你之前写的.stats | map(del(.value) + .value[])没有达到预期,原因是仅完成了外层value数组的拼接,没有对value数组内部的嵌套对象做键值对拆分,也没有完成字段重命名。可直接使用以下语句完成完整转换:
.stats[] | {devid, key} as $base | .value[] | to_entries | .[] | {devid: $base.devid, key: $base.key, nodeId: (.key | tonumber), value: .value}
执行逻辑说明
- 先遍历stats数组的每个元素,将每个条目公共的
devid、key字段暂存为公共上下文$base,避免后续拆分内层结构时丢失字段关联 - 逐层展开value数组的元素,对数组内承载键值对的嵌套对象执行
to_entries操作,将对象的动态键值对拆分为独立的条目列表 - 遍历拆分后的每一个键值对条目,组装为目标结构:将原嵌套对象的字符串键转为数字类型作为
nodeId字段,对应键的数值作为value字段,同时带上暂存的公共devid、key字段
输出效果验证
对提供的输入载荷执行上述语句,输出结构完全匹配预期,示例输出如下:
{"devid":3,"key":"diskall","nodeId":0,"value":0.0001} {"devid":3,"key":"diskall","nodeId":1,"value":0.0001} {"devid":3,"key":"diskall","nodeId":2,"value":0.0012} {"devid":7,"key":"diskall","nodeId":0,"value":0.0003}
注:由于原始value对象的键数量是动态值,该语句无需调整即可适配任意长度、任意键数量的嵌套结构。
内容的提问来源于stack exchange,提问作者nobrac
相关产品推荐
相关产品推荐

