jq技术问询:如何基于数组配置用指定键值生成嵌套键结构
jq实现方案
核心命令
del(.arr) + reduce .arr[] as $item ({}; ($item.result | ltrimstr(".") | split(".")) as $path; ($item.vals | map(getpath(ltrimstr(".") | split(".")))) as $values; setpath($path; ($item.fmt | printf($values[]))) )
命令拆解
del(.arr):删除原JSON中的arr字段,保留原有A、B、C键值对reduce .arr[] as $item ({}; ...):遍历arr数组的每个配置项,从零开始构建嵌套结构($item.result | ltrimstr(".") | split(".")) as $path:将result中的路径字符串(如.R1.R3)去除开头的.后拆分为键数组(如["R1", "R3"])($item.vals | map(getpath(ltrimstr(".") | split(".")))) as $values:解析vals中的每个路径,获取对应字段的值(如[".A", ".B"]会提取出[100, 200])setpath($path; ($item.fmt | printf($values[]))):使用setpath将格式化后的字符串(通过printf结合fmt模板和values生成)写入指定的嵌套路径+:将保留的原有字段与新生成的嵌套结构合并,得到最终结果
运行方式
将上述jq命令直接在命令行执行,指定输入文件:
jq 'del(.arr) + reduce .arr[] as $item ({}; ($item.result | ltrimstr(".") | split(".")) as $path; ($item.vals | map(getpath(ltrimstr(".") | split(".")))) as $values; setpath($path; ($item.fmt | printf($values[])))' input.json
效果验证
输入指定的JSON数据后,会输出符合要求的结果:保留A、B、C,同时生成R1、R2嵌套结构。
内容的提问来源于stack exchange,提问作者Anton Romanov
相关产品推荐
相关产品推荐

