如何用jq访问含特殊字符的字段(对象/数组)并判断非空term
解决JSON转CSV的非空字段检查需求
没问题,我来帮你搞定这个用jq处理JSON并生成CSV的需求!针对你提到的Production可能是对象或数组、creator.role带特殊字符的情况,这里有个直接能用的解决方案:
核心jq命令
直接运行这条命令就能生成你要的CSV文件:
jq -r '.[].recordList.record[] | .Production | if type == "array" then . else [.] end | any(."creator.role"?; .?.term != "") | if . then 1 else 0 end' file.json > result.csv
命令逻辑拆解
咱们一步步看每个部分是干啥的:
.[].recordList.record[]:先定位到JSON里的每条record数据,遍历所有记录.Production | if type == "array" then . else [.] end:把Production统一转成数组格式——不管它原本是单个对象还是多个对象的数组,这样后面就能用统一的逻辑处理any(."creator.role"?; .?.term != ""):检查数组里是否存在至少一个满足条件的项:."creator.role"?:用引号包裹带点的字段名,同时加?避免字段不存在时报错.?term != "":确保term字段存在且不是空字符串
if . then 1 else 0 end:把jq返回的布尔值(true/false)转换成你要的1和0-r参数:让jq输出纯文本(不带引号),符合CSV的格式要求
示例验证
用你给出的示例JSON数据运行这条命令,会输出4行结果:
1 0 0 1
对应每条record的检查结果:
- 第一条有非空的
term:A→ 1 - 第二条没有
creator.role字段 → 0 - 第三条
term是空字符串 → 0 - 第四条数组里有
term:B→ 1
可选:添加CSV表头
如果需要给CSV加表头,先执行echo命令再追加结果:
echo "has_non_empty_creator_role" > result.csv && jq -r '.[].recordList.record[] | .Production | if type == "array" then . else [.] end | any(."creator.role"?; .?.term != "") | if . then 1 else 0 end' file.json >> result.csv
内容的提问来源于stack exchange,提问作者Tine
相关产品推荐
相关产品推荐

