使用jq处理API返回的JSON对象/数组,生成CSV时规避空值
jq处理动态JSON(对象/数组/Null)转CSV方案
1. 统一不确定字段的类型
API返回的字段可能是单个对象、数组或null,直接迭代会报错,先把它们统一转成数组:
- 用
// []把null转成空数组 - 用
if type == "object" then [.] else . end把单个对象包装成单元素数组
比如处理software.name字段:
.software // {} | .name // [] | if type == "object" then [.] else . end
2. 遍历数组并替换空值
统一成数组后,遍历每个元素,把所有null字段替换成空字符串:
.software // {} | .name // [] | if type == "object" then [.] else . end | map({ name: .value // "", version: .version // "" })
3. 输出标准CSV格式
结合jq的@csv过滤器,先定义表头,再拼接数据行,确保空值正确显示:
完整命令示例:
jq -r ' # 统一处理软件名称为数组 .software // {} | .name // [] | if type == "object" then [.] else . end # 映射为CSV需要的列,空值替换为"" | map([ .value // "", .version // "", (.extra_info // "") ]) # 添表头后转CSV | ["软件名称", "版本", "额外信息"], .[] | @csv ' api_response.json
4. 全局批量替换空值
如果要一次性把所有null转成空字符串,可以用walk递归处理:
jq -r ' # 全局替换所有null为空字符串 walk(if type == "null" then "" else . end) # 统一字段类型 | .software // {} | .name // [] | if type == "object" then [.] else . end # 生成CSV行 | map([.value, .version, .extra_info]) | ["软件名称", "版本", "额外信息"], .[] | @csv ' api_response.json
关键错误规避点
//是jq的默认值操作符,左边不存在或为null时自动用右边值兜底- 统一转数组后,哪怕是空数组,
map也不会抛出"Cannot iterate over null"错误 walk递归处理所有层级的null,避免后续字段访问时出问题
内容的提问来源于stack exchange,提问作者def0to
相关产品推荐
相关产品推荐

