通过Curl传递变量更新Gist时JSON解析失败问题求助
解决Gist更新时的JSON解析错误
问题根源
手动拼接JSON字符串时,content变量中可能包含JSON特殊字符(比如双引号"、反斜杠\、换行符\n等),这些字符会直接破坏JSON的语法结构,导致GitHub API无法正常解析请求体。直接用字符串拼接生成JSON的方式极易触发这类问题。
解决方案
改用jq工具来生成合法的JSON数据,它会自动处理所有特殊字符的转义操作,彻底避免手动拼接带来的格式错误。
修改后的完整脚本
#!/bin/bash # 替换为你的个人访问令牌 access_token="<access_token>" # 读取存储Gist ID的文件(每行一个ID) while read -r gist_id; do # 获取Gist的原始数据 gist_data=$(curl -s -H "Authorization: token $access_token" "https://api.github.com/gists/$gist_id") # 提取文件名和内容 filename=$(echo "$gist_data" | jq -r '.files | keys[]') content=$(echo "$gist_data" | jq -r ".files[\"$filename\"].content") # 修改指定行内容 # 替换为你需要的行号和新内容 new_content="<new_content>" line_number=<line_number> content=$(echo "$content" | sed "${line_number}s/.*/$new_content/") # 用jq生成合法JSON,发送更新请求 # 替换为你需要的Gist描述 curl -s -X PATCH \ -H "Authorization: token $access_token" \ -H "Content-Type: application/json" \ -d "$(jq -n --arg desc "<gist_description>" --arg fname "$filename" --arg cont "$content" '{description: $desc, files: {($fname): {content: $cont}}}')" \ "https://api.github.com/gists/$gist_id" > /dev/null done < "gist_ids.txt"
核心修改说明
- 用
jq构造JSON:通过jq -n结合--arg参数传递变量,jq会自动处理变量中的特殊字符转义,确保生成的JSON完全符合语法规范。 - 添加
Content-Type请求头:明确告知API请求体为JSON格式,消除潜在的解析歧义。 - 抛弃手动拼接:彻底避免直接拼接字符串生成JSON,从根源上解决格式破坏问题。
额外提示
- 若
new_content或原始content包含多行文本、特殊符号等复杂内容,jq都能正确处理转义,无需额外操作。 - 确保系统已安装
jq工具,未安装可通过包管理器安装(如Debian/Ubuntu用apt install jq,macOS用brew install jq)。
内容的提问来源于stack exchange,提问作者Gabriel Palmar
相关产品推荐
相关产品推荐

