使用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
关键细节说明
get_tag函数:自动判断Tags的类型,数组则遍历匹配Key取值,对象则直接按键取值,无Tags字段则返回空字符串。// ""语法:当字段不存在时,用空字符串替代jq默认的null,避免CSV出现无效值。@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
相关产品推荐
相关产品推荐

