You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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是否为数组,是的话遍历每个元素提取devId
  • type == "object":判断.meta.dev是否为单个对象,直接提取devId
  • // "":若devId不存在,自动替换为空字符串
  • @csv:自动将结果格式化为标准CSV,处理特殊字符与引号

内容的提问来源于stack exchange,提问作者space

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:15:25