Shell脚本中使用curl命令如何发送嵌套对象格式的POST数据?
问题原因
原脚本存在3个核心错误导致JSON格式异常、服务端解析失败:
- JSON字符串值未包裹双引号:JSON规范要求字符串类型的字段值必须用双引号包裹,原脚本直接拼接
serialno、filePath的变量值,无外层双引号,直接破坏JSON结构。 - 请求头格式非法:原脚本
-H "'Content-Type: application/json'"多套了一层多余的单引号,导致服务端无法识别请求体为JSON格式,触发异常解析逻辑。 - 变量拼接逻辑不严谨:直接在单引号外拼接路径变量,若路径存在空格、特殊字符会进一步破坏JSON结构。
修正后完整脚本
#!/bin/bash echo "hello welcome to testing" token=asdghadjakalskl..... sNo=(ab1 ab2 ab3 ab4 ab5) fn=(notes1 Pictures/crop.jpeg Pictures/cat.jpeg Pictures/mountain.jpg Pictures/magic.jpeg Pictures/tree.jpg) echo $1 for (( i=0; i< $1;i++ )) do echo ${sNo[i%5]} ${fn[i%6]} f="/home/name/${fn[i%6]}" echo file $f echo $i request sent curl -d "{\"DataArr\":[{\"serialno\":\"${sNo[i%5]}\",\"filePath\":\"$f\"}]}" \ -H 'Content-Type: application/json' \ -H "Authorization: $token" \ http://localhost:8080/create done
关键修改说明
- 给
serialno和filePath的变量值外层添加转义双引号\",保证生成的JSON完全符合语法规范 - 移除
Content-Type请求头外层多余的单引号,确保服务端正常识别JSON格式请求体 - 优化
Authorization头的拼接逻辑,删除多余的嵌套引号,避免认证失败 - 整个请求体用双引号包裹,内部双引号通过反斜杠转义,保证变量正常解析的同时不破坏JSON结构
可选优化方案
如果你的序列号、文件路径可能包含特殊字符(如空格、双引号),推荐用jq工具动态生成JSON,彻底避免手动拼接的格式问题:
# 循环内生成JSON的代码替换为 json_body=$(jq -n --arg sn "${sNo[i%5]}" --arg path "$f" '{"DataArr": [{"serialno": $sn, "filePath": $path}]}') # curl调用改为 curl -d "$json_body" \ -H 'Content-Type: application/json' \ -H "Authorization: $token" \ http://localhost:8080/create
内容的提问来源于stack exchange,提问作者kira
相关产品推荐
相关产品推荐

