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

使用Bash+JQ转换不一致JSON为CSV时遇错误,求解决方案

排查jq索引错误并实现JSON转结构化CSV的简便方法

问题根源

你遇到的"无法用字符串索引数组"错误,本质是JSON数据结构不一致:部分字段(比如Tags)在不同条目里可能是数组(比如[{"Key":"CostCenter", "Value":"xxx"}]),而你的脚本用了针对对象的索引方式(比如.Tags.CostCenter),数组只能用数字索引(如.[0]),直接用字符串索引就会触发错误。

简便实现方案

下面的脚本用jq内置的类型判断和自定义函数,适配数组/对象混合的JSON结构,自动提取目标字段,缺失字段留空,输出标准CSV:

示例JSON数据(模拟你的结构)

[
  {
    "ARN": "arn:aws:lambda:us-east-1:123456789012:function:my-func",
    "STAGE": "prod",
    "Tags": [{"Key": "CostCenter", "Value": "CC-001"}, {"Key": "Service", "Value": "payment"}]
  },
  {
    "ARN": "arn:aws:s3:::my-bucket",
    "Tags": {"Domain": "retail", "Team": "store-team"},
    "OtherField": "ignore"
  },
  {
    "ARN": "arn:aws:ec2:us-east-1:123456789012:instance/i-123456",
    "STAGE": "dev"
    # 无Tags字段
  }
]

完整Bash脚本

#!/bin/bash

# 输出CSV表头
echo "ARN,STAGE,CostCenter,Service,Domain,Team"

# 用jq处理JSON,适配混合结构
jq -r '
  .[] |
  # 自定义函数:从Tags(支持数组/对象/不存在)中提取指定Key的值
  def get_tag(key):
    if .Tags | type == "array" then
      .Tags[] | select(.Key == key) | .Value // ""
    elif .Tags | type == "object" then
      .Tags[key] // ""
    else
      ""
    end;
  # 按顺序提取字段,缺失则填充空字符串
  [
    .ARN // "",
    .STAGE // "",
    get_tag("CostCenter"),
    get_tag("Service"),
    get_tag("Domain"),
    get_tag("Team")
  ] | @csv
' input.json

关键细节说明

  1. get_tag函数:自动判断Tags的类型,数组则遍历匹配Key取值,对象则直接按键取值,无Tags字段则返回空字符串。
  2. // ""语法:当字段不存在时,用空字符串替代jq默认的null,避免CSV出现无效值。
  3. @csv过滤器:自动处理CSV的格式问题(比如含逗号/引号的字段会自动加引号包裹)。

输出结果(符合你的期望格式)

ARN,STAGE,CostCenter,Service,Domain,Team
"arn:aws:lambda:us-east-1:123456789012:function:my-func","prod","CC-001","payment","",""
"arn:aws:s3:::my-bucket","","","","retail","store-team"
"arn:aws:ec2:us-east-1:123456789012:instance/i-123456","dev","","","",""

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:33:20