新手求助:如何用jq将嵌套JSON转换为指定格式CSV?
用JQ将嵌套JSON转换为CSV的解决方案
作为JQ新手,需要把三层嵌套的JSON转换成指定格式的CSV。
示例嵌套JSON(修正为合法格式)
{ "level1-label": { "level2-text1": { "level3-label1": "value1", "level3-label2": "value2", "level3-label3": "value3" }, "level2-text2": { "level3-label1": "value4", "level3-label2": "value5", "level3-label3": "value6" } } }
注意:合法JSON要求键和字符串值必须用双引号包裹,否则JQ无法正常解析。
期望CSV输出
level2, level3-label1, level3-label2, level3-label3 level2-text1, value1, value2, value3 level2-text2, value4, value5, value6
已尝试的查询
你已经写出了两个分别提取level2键和level3键值的JQ查询:
- 提取level2键:
jq -r ".level1-label | to_entries | map([.key])" input.json
- 提取level3键值:
jq -r ".level1-label | to_entries | map(.value)" input.json
合并查询的解决方案
核心思路是把level2的键和对应的level3值合并到同一个数组中,再用JQ的@csv过滤器生成标准CSV格式。
固定level3键的场景(适合你的示例)
直接指定要提取的level3键,写法简单直观:
jq -r ' # 定义CSV表头 ["level2", "level3-label1", "level3-label2", "level3-label3"], # 遍历每个level2条目,组合键与对应的level3值 .level1-label | to_entries[] | [.key, .value."level3-label1", .value."level3-label2", .value."level3-label3"] # 转换为CSV格式 | @csv ' input.json
动态level3键的场景(通用写法)
如果level3的键数量或名称不固定,可以自动获取所有level3键来生成表头和对应值:
jq -r ' # 获取第一个level2条目的所有level3键,作为表头的一部分 (.level1-label | to_entries[0].value | keys) as $level3_keys # 组合完整表头 | ["level2"] + $level3_keys, # 遍历每个level2条目,按表头顺序提取键和对应值 .level1-label | to_entries[] | [.key] + [$level3_keys[] as $k | .value[$k]] # 转换为CSV格式 | @csv ' input.json
内容的提问来源于stack exchange,提问作者Cloud wind
相关产品推荐
相关产品推荐

