如何在Linux命令行用jq将嵌套JSON转换为CSV?求解决方案
用jq将嵌套JSON转换为CSV/Markdown表格的解决方案
针对你提供的嵌套JSON结构,这里给出具体的jq命令,实现将文件名作为第一列,展开嵌套的Setting字段,并统一处理不同字段名(如部分对象用Check而非Rule),最终生成符合要求的CSV或Markdown表格。
生成CSV格式
执行以下命令,将输入JSON文件(假设名为input.json)转换为标准CSV:
jq -r ' to_entries[] | .key as $filename | .value[] | .Setting + {Filename: $filename} + del(.Setting) | {Filename, SettingA, SettingB, Rule: (.Rule // .Check), Description, Line, Link, Message, Severity, Span: (.Span | join(",")), Match} | [.Filename, .SettingA, .SettingB, .Rule, .Description, .Line, .Link, .Message, .Severity, .Span, .Match] | @csv ' input.json
命令解析
to_entries[]:将顶层的文件名-错误数组键值对转换为可遍历的条目结构.key as $filename:保存当前文件名到变量,后续作为表格第一列.value[]:遍历每个文件名对应的所有错误对象.Setting + {Filename: $filename} + del(.Setting):展开Setting中的字段,合并文件名到当前对象,删除原Setting字段Rule: (.Rule // .Check):兼容部分对象使用Check字段的情况,统一映射到Rule列[.Filename, ...]:按指定顺序整理需要导出的字段为数组@csv:将数组转换为标准CSV格式,自动处理特殊字符和引号
转换后的CSV示例:
"dir/file1.txt","",null,"Rulechecker.Rule15","",11,"www.sample.com","Some message","error","1,3","[id" "dir/file1.txt","",null,"Rulechecker.Rule16","",27,"www.sample.com","Fix the rule","error","1,3","[id" "dir/file2.txt","",null,"Rulechecker.Rule17","",51,"www.example.com","Fix another 'rule'?","error","1,18","[source,terminal] ---- "
生成Markdown表格格式
如果需要直接生成你展示的Markdown表格,可执行以下命令:
jq -r ' ["Filename", "SettingA", "SettingB", "Rule", "Description", "Line", "Link", "Message", "Severity", "Span", "Match"] as $headers | $headers | @csv, | $headers | map("---") | @csv, | to_entries[] | .key as $filename | .value[] | .Setting + {Filename: $filename} + del(.Setting) | {Filename, SettingA, SettingB, Rule: (.Rule // .Check), Description, Line, Link, Message, Severity, Span: (.Span | join(",")), Match} | [.Filename, .SettingA, .SettingB, .Rule, .Description, .Line, .Link, .Message, .Severity, .Span, .Match] | @csv ' input.json | sed ' 1s/^/| /; 1s/$/ |/; 1s/,/ | /g; 2s/^/| /; 2s/$/ |/; 2s/,/ | /g; 3,$s/^/| /; 3,$s/$/ |/; 3,$s/,/ | /g '
命令解析
在CSV生成逻辑基础上,增加了:
- 定义表头数组并输出表头行
- 生成表头对应的分隔线行
- 通过
sed将CSV格式转换为Markdown表格的分隔符格式
最终生成的Markdown表格如下:
| Filename | SettingA | SettingB | Rule | Description | Line | Link | Message | Severity | Span | Match |
|---|---|---|---|---|---|---|---|---|---|---|
| dir/file1.txt | null | Rulechecker.Rule15 | 11 | www.sample.com | Some message | error | 1,3 | [id | ||
| dir/file1.txt | null | Rulechecker.Rule16 | 27 | www.sample.com | Fix the rule | error | 1,3 | [id | ||
| dir/file2.txt | null | Rulechecker.Rule17 | 51 | www.example.com | Fix another 'rule'? | error | 1,18 | [source,terminal] ---- |
内容的提问来源于stack exchange,提问作者roniac
相关产品推荐
相关产品推荐

