如何通过命令行将嵌套JSON解析为CSV文件
解析嵌套JSON为包含展开动态字段的CSV
示例JSON数据
{"tables":[{"name":"PrimaryResult","columns":[{"name":"name","type":"string"},{"name":"id","type":"string"},{"name":"custom","type":"dynamic"}],"rows":[["Alpha","1","{\"age\":\"23\",\"number\":\"xyz\"}"]]}]}
期望CSV输出
name,id,age,number Alpha,1,23,xyz
尝试的命令及问题
执行了以下两条jq命令:
jq -r ".tables | .[] | .columns | map(.name)|@csv" demo.json > demo.csv jq -r ".tables | .[] | .rows |.[]|@csv" demo.json >> demo.csv
实际输出未展开custom字段,不符合预期:
name,id,custom Alpha,1,"{""age"":""23"",""number"":""xyz""}"
正确解决方案
使用以下单条jq命令即可完成需求:
jq -r ' .tables[] | # 提取基础字段名,排除custom ( .columns | map(.name) | select(. != "custom") ) as $base_cols | # 解析custom字段的结构,提取其键作为额外列名 ( .rows[0][2] | fromjson | keys ) as $custom_cols | # 合并列名并输出 $base_cols + $custom_cols | @csv, # 处理每一行:展开custom字段并合并数据 .rows[] | .[0,1] + (.[2] | fromjson | [.age, .number]) | @csv ' demo.json > demo.csv
命令说明
.tables[]:遍历tables数组中的目标表元素$base_cols:提取custom以外的基础列名(name、id)$custom_cols:解析首行的custom字符串为JSON,动态获取其键作为新增列名- 先输出合并后的完整列名行,再逐行处理数据:取前两个基础字段,解析
custom并提取对应值,合并后转为CSV格式
如果custom字段的结构固定(始终包含age和number),可简化命令:
jq -r ' .tables[] | ["name","id","age","number"] | @csv, .rows[] | .[0,1] + (.[2] | fromjson | [.age, .number]) | @csv ' demo.json > demo.csv
内容的提问来源于stack exchange,提问作者Supraja
相关产品推荐
相关产品推荐

