VBA中通过Shell.Run执行Curl PATCH请求报错问题排查
VBA调用curl发送PATCH请求触发JSON解码错误的原因及解决方法
错误原因
JSON语法明确要求属性名必须用双引号包裹,但VBA对字符串的双引号处理规则和Python不同:
- VBA中字符串以双引号为边界,内部的双引号需要用
""转义才能被正确识别。如果你的VBA代码里直接写未转义的双引号构造JSON,最终发送的请求体要么丢失引号,要么被命令行解析截断,导致json-server收到的JSON格式不符合规范,触发JSONDecodeError。 - Python中可以用单引号包裹字符串、或者通过
json.dumps()自动处理JSON格式,天然避免了这个转义问题,所以相同逻辑能正常运行。
解决方法
1. 正确转义JSON字符串中的双引号
构造请求体时,把JSON里的每个双引号替换成两个双引号:
Dim jsonBody As String ' 转义后的JSON,属性名和结构符合规范 jsonBody = "{""isXlOpen"": {""st"": false}}"
2. 正确拼接curl命令参数
调用Shell.Run时,要确保curl的参数被命令行正确解析,特别是-H(请求头)和-d(请求体)部分的引号:
Dim curlCmd As String ' 拼接完整curl命令,注意每个双引号都要转义 curlCmd = "curl -X PATCH http://localhost:3000/general -H ""Content-Type: application/json"" -d """ & jsonBody & """" ' 执行命令,vbHide表示隐藏命令行窗口 Shell.Run curlCmd, vbHide
3. 调试验证
先把构造好的curlCmd通过MsgBox curlCmd打印出来,复制到系统命令行直接执行:
- 如果命令行执行也报错,说明JSON格式仍有问题,继续调整转义逻辑;
- 如果命令行执行正常,说明VBA的Shell命令拼接存在其他解析问题,可尝试用
ShellExecute替代Shell.Run(需要引用Shell32),或者把命令写入批处理文件再调用。
内容的提问来源于stack exchange,提问作者MarcusAurelius
相关产品推荐
相关产品推荐

