jq转换可变结构JSON到CSV遇索引错误求解决方案
解决JSON数组转CSV时提取多结构字段的问题
问题背景
你有一个包含数千个文档的JSON数组文件,需要提取每个文档的.meta.dev.devId值并转为CSV,其中.meta.dev的结构存在三种情况:
- 是单个子文档
- 是子文档数组
- 不存在该字段
要求字段不存在时CSV对应列为空,之前尝试的三条jq命令因未兼容所有结构报错。
错误原因分析
- "Cannot index string with string 'devId'":某个文档的
.meta.dev是字符串类型,直接用.devId索引字符串导致报错 - "Cannot iterate over null (null)":尝试迭代
.meta.dev但该字段不存在(为null),无法迭代 - "Cannot index array with string 'devId'":某个文档的
.meta.dev是数组,直接用.meta.dev.devId索引数组导致报错
解决方案
方案1:每个文档对应一行,数组devId用逗号分隔
该方案将每个文档的所有devId合并到同一列,用逗号分隔,适合保持文档与CSV行的一一对应:
jq -r ' ["devId"], (.[] | [ (.meta.dev | if type == "array" then [.[].devId // ""] | join(",") elif type == "object" then .devId // "" else "" end ) ]) | @csv' input.json
方案2:数组中每个devId单独占一行
如果需要将数组中的每个devId单独作为一行输出(原文档其他字段若有则重复),使用此命令:
jq -r ' ["devId"], (.[] | (.meta.dev // [{}]) | if type == "array" then .[] else . end | [.devId // ""] ) | @csv' input.json
命令说明
type == "array":判断.meta.dev是否为数组,是的话遍历每个元素提取devIdtype == "object":判断.meta.dev是否为单个对象,直接提取devId// "":若devId不存在,自动替换为空字符串@csv:自动将结果格式化为标准CSV,处理特殊字符与引号
内容的提问来源于stack exchange,提问作者space
相关产品推荐
相关产品推荐

