动态添加Jobs和Steps时Shell脚本Dynamo JSON格式化报错
排查DynamoDB JSON生成的语法错误
错误原因分析
你遇到的Expecting ',' delimiter错误,本质是手动拼接JSON时出现了语法问题,最常见的场景包括:
- 最后一个
job或step后面多了逗号 - 字符串中包含未转义的特殊字符(比如双引号、反斜杠)
- 变量中的空白字符(换行、制表符)破坏了JSON结构
快速排查步骤
输出并验证生成的JSON
把脚本生成的JSON输出到文件,用jq工具检查语法:# 假设你的脚本是generate_json.sh ./generate_json.sh > output.json jq . output.jsonjq会直接指出具体的语法错误位置,比AWS CLI的提示更清晰。检查逗号拼接逻辑
手动循环生成job或step时,要确保最后一个元素后面没有多余的逗号。比如:- 初始化时标记第一个元素,后续元素前加逗号,而不是所有元素后加逗号
- 错误示例:每个
step后都加逗号,导致最后一个step后多了逗号,破坏数组结构
检查字符串转义
如果job或step的名称/内容包含双引号、反斜杠,必须转义为\"或\\。比如:- 错误写法:
{"name": "job "test""} - 正确写法:
{"name": "job \"test\""}
- 错误写法:
推荐解决方案:用jq生成JSON
手动拼接JSON极易出错,建议用jq工具动态生成,它会自动处理语法转义、逗号拼接等问题。示例脚本:
# 定义jobs的数据源(可以从文件或变量读取) jobs=() jobs+=('{"name": "数据同步任务", "steps": [{"action": "拉取数据"}, {"action": "清洗数据"}]}') jobs+=('{"name": "备份任务", "steps": [{"action": "快照生成"}, {"action": "上传S3"}]}') # 用jq组合成符合DynamoDB要求的JSON结构 final_json=$(jq -n --argjson jobs "$(printf '%s\n' "${jobs[@]}" | jq -s .)" '{jobs: $jobs}') # 验证JSON语法 echo "$final_json" | jq . # 执行AWS CLI命令 aws dynamodb put-item --table-name your-table-name --item "$final_json"
手动拼接的正确示例(不推荐)
如果必须手动拼接,严格控制逗号和转义:
# 初始化JSON结构 json='{"jobs": [' # 处理jobs数组 first_job=true for job_name in "任务1" "任务2"; do # 非第一个job前加逗号 if [ "$first_job" = false ]; then json+=',' fi first_job=false # 处理当前job的steps step_json='{"name": "'"$job_name"'", "steps": [' first_step=true for step_action in "步骤A" "步骤B"; do if [ "$first_step" = false ]; then step_json+=',' fi first_step=false # 转义step中的特殊字符(如果有) escaped_step=$(printf '%s' "$step_action" | sed 's/"/\\"/g') step_json+='{"action": "'"$escaped_step"'"}' done step_json+=']}' json+="$step_json" done # 闭合JSON结构 json+=']}' # 验证后执行命令 echo "$json" | jq . aws dynamodb put-item --table-name your-table-name --item "$json"
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

