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

如何在Shell中向URL提交含特殊字符的JSON数据?

解决curl提交含特殊字符JSON的问题

你的核心问题是shell解析特殊字符时破坏了JSON结构,比如!会触发bash历史扩展、&会被当作后台进程分隔符,直接拼接变量会导致JSON格式错误。下面是几种可靠的解决方法:

方法1:单引号拼接变量

用单引号包裹JSON主体,仅在变量部分使用双引号,避免shell解析特殊字符:

var="!@#$%^&*~!@#$%^&"
curl http://localhost:3001 -H "Content-Type: application/json" -d '{"attr1":1,"attr2":"2","attr3":{"attr4":"'"$var"'"}}'

解释:'"$var"'的写法是先闭合单引号,用双引号包裹变量(保留变量值的原始内容),再重新打开单引号拼接剩余JSON。

方法2:Here-doc传递JSON

通过here-doc直接传递完整JSON内容,无需复杂的引号转义:

var="!@#$%^&*~!@#$%^&"
curl http://localhost:3001 -H "Content-Type: application/json" -d @- <<EOF
{"attr1":1,"attr2":"2","attr3":{"attr4":"$var"}}
EOF

-d @-表示从标准输入读取数据,here-doc里的变量会被正常展开,同时特殊字符不会被shell解析。

方法3:用jq生成合法JSON(推荐)

jq是专门处理JSON的工具,会自动转义特殊字符,确保生成的JSON完全符合规范:

# 安装jq(如果未安装):sudo apt install jq / brew install jq
var="!@#$%^&*~!@#$%^&"
json=$(jq -n --arg v "$var" '{attr1:1, attr2:"2", attr3:{attr4:$v}}')
curl http://localhost:3001 -H "Content-Type: application/json" -d "$json"

--arg v "$var"将shell变量传入jq,jq会自动处理!@#$%^&等特殊字符的转义,彻底避免手动拼接的错误。

关于--data-urlencode的说明

--data-urlencode是用来编码表单数据的,不是直接处理JSON的。如果服务器期望接收application/x-www-form-urlencoded格式的表单(而非JSON),可以把整个JSON作为表单字段值编码:

var="!@#$%^&*~!@#$%^&"
json_str="{\"attr1\":1,\"attr2\":\"2\",\"attr3\":{\"attr4\":\"$var\"}}"
curl http://localhost:3001 --data-urlencode "json=$json_str"

但这种情况需要服务器端解析json字段并转换为JSON对象,如果你要提交的是纯JSON请求体,不建议用这种方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:50:23