JQ新手求助:如何将嵌套JSON结构扁平化以转换为CSV
解决JQ扁平JSON结构的方案
Hey there! 作为JQ新手折腾这个确实挺费时间的,不过你的需求其实用JQ的几个核心操作就能轻松实现,我给你详细拆解下:
完整的JQ命令
jq 'map({title, updated_at} + (.fields | reduce .[] as $item ({}; . + ($item | with_entries(select(.key | IN("usernamevalue", "passwordvalue")))) ))' your-source-file.json
命令逐部分解释
map(...):遍历源JSON数组中的每一个对象,对每个条目单独处理,确保最终输出还是数组结构。{title, updated_at}:快速从顶层对象中提取你需要保留的两个字段,这是JQ的语法糖,和{title: .title, updated_at: .updated_at}效果完全一致。.fields | reduce .[] as $item ({}; . + (...)):处理嵌套的fields数组:reduce用来遍历fields里的每一个子对象$item,初始值设为空对象{};$item | with_entries(select(.key | IN("usernamevalue", "passwordvalue"))):筛选出每个子对象中键为usernamevalue和passwordvalue的条目,只保留这两个字段;- 最后用
+把筛选后的键值对合并到初始的空对象里,把分散在fields数组中的目标字段整合到一个对象中。
+:把顶层提取的title、updated_at字段,和从fields中整合出的字段合并成一个扁平的对象,正好符合你要的目标结构。
兼容低版本JQ的写法(如果你的JQ版本低于1.6)
如果你的JQ版本不支持IN函数,可以把筛选部分换成index判断:
jq 'map({title, updated_at} + (.fields | reduce .[] as $item ({}; . + ($item | with_entries(select(.key | index(["usernamevalue", "passwordvalue"]) != null)) ))' your-source-file.json
测试验证
用你提供的源JSON运行命令后,会直接输出你期望的扁平结构,完美适配后续转CSV的需求。
内容的提问来源于stack exchange,提问作者agsvm
相关产品推荐
相关产品推荐

