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

Bash中POST请求JSON数据嵌入动态变量的问题求助

Bash中POST请求动态JSON数据的问题解决

问题根源

  • 单引号包裹的JSON内容里,${stringVar}不会被Bash解析,API收到的是未替换的变量名,直接导致JSON无效。
  • 若用双引号包裹JSON,变量展开后,字符串中的特殊字符(双引号、换行、反斜杠)会破坏JSON语法,比如未转义的双引号会提前终止字段值,引发格式错误。

方法一:用jq构造合法JSON(推荐)

jq是专门处理JSON的工具,能自动处理所有特殊字符的转义,确保生成的JSON完全符合语法:

#!/bin/bash

# 从文件读取内容的话,替换成 stringVar=$(cat your-file-path.txt)
stringVar="helloWorldFunction() {\n echo \"hello world\" \n}"

curl -i -H "Authorization: Bearer <MY_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -X POST 'https://api.example.com/v1/endpoint' \
  -d "$(jq -n \
    --arg projectName "my-project" \
    --arg fileData "$stringVar" \
    '{name: $projectName, files: [{data: $fileData}]}')"

说明:

  • jq -n表示从头构建JSON结构
  • --arg参数用于将Bash变量传递给jq,jq会自动对变量中的双引号、换行、反斜杠等字符做JSON合规转义
  • 最终生成的JSON无语法错误,适配各种复杂字符串场景

方法二:手动转义变量后拼接JSON

如果无法使用jq,可以通过sed手动转义特殊字符,再拼接JSON:

#!/bin/bash

stringVar="helloWorldFunction() {\n echo \"hello world\" \n}"
# 转义JSON所需的特殊字符:反斜杠→双反斜杠,双引号→\",换行→\\n
escapedData=$(printf '%s' "$stringVar" | sed 's/\\/\\\\/g; s/"/\\"/g; s/\n/\\n/g')

curl -i -H "Authorization: Bearer <MY_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -X POST 'https://api.example.com/v1/endpoint' \
  -d "{
    \"name\": \"my-project\",
    \"files\": [
        {
            \"data\": \"$escapedData\"
        }
    ]
}"

说明:

  • 外层用双引号包裹JSON,让Bash能解析变量
  • 手动转义JSON结构中的双引号(加反斜杠),同时转义变量内的特殊字符,避免破坏JSON格式
  • 删除原JSON中数组元素末尾多余的逗号(严格JSON语法不允许 trailing comma)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:56