You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用cURL发送JSON时如何保留换行符?

解决JSON中保留换行符的问题

这个问题的核心在于shell变量替换时会把换行符转换成空格,而且JSON字符串不允许直接包含未转义的换行——咱们得用正确的方式把包含换行的内容转成合法的JSON格式。

最可靠的方案:用jq处理JSON构造

jq是专门处理JSON的工具,能自动帮你处理字符串中的换行、引号等特殊字符,确保生成的JSON完全合规。修改后的代码如下:

# 获取加密后的输出,保留所有换行
output=$(ls -la /home/john | gpg --armor --encrypt --recipient john@example.net)

# 用jq构造合法的JSON,自动转义换行和特殊字符
curl \
--request POST \
--url https://api.example.net/sendmail \
--header 'Content-Type: application/json' \
--data "$(jq -n --arg msg "$output" '{subject: "Test", message: $msg}')"

为什么这能生效?

  • --arg msg "$output" 会把$output的完整内容(包括所有换行)作为一个字符串传递给jq
  • jq会自动将字符串中的换行转义成JSON支持的\n,同时处理双引号、反斜杠等其他特殊字符,生成完全符合规范的JSON

备选方案:手动转义(不推荐,易出错)

如果环境中没有jq,可以用sed手动转义所有需要处理的字符,但这种方式需要覆盖更多边缘情况,不如jq省心:

output=$(ls -la /home/john | gpg --armor --encrypt --recipient john@example.net)

# 手动转义反斜杠、双引号和换行
escaped_message=$(printf '%s' "$output" | sed 's/\\/\\\\/g; s/"/\\"/g; s/\n/\\n/g')

curl \
--request POST \
--url https://api.example.net/sendmail \
--header 'Content-Type: application/json' \
--data @- << EOF
{ "subject": "Test", "message": "$escaped_message" }
EOF

原代码的问题出在哪?

  1. 虽然你用双引号包裹了$output,但在here-doc中,shell仍然会对变量内容进行分词——换行符会被替换成空格
  2. 即使换行没被替换,JSON字符串中直接包含换行也是非法的,必须转义成\n

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

火山引擎 最新活动