VBA用MSXML2.XMLHTTP发POST请求解析JSON报Expecting '{'或'['错误求助
问题根因及修复方案
根因定位
你遇到的JSON解析报错本质是请求体格式不符合JSON规范,导致API服务端拒绝处理,返回了空响应/非JSON格式的错误响应,最终JsonConverter解析空内容时报错。
对比你提供的正常工作的参考代码,原来的问题代码的请求体存在以下错误:
- 所有JSON字符串类型的字段、值都未用双引号包裹:包括
methodType的取值extract、sourceApplication的取值DSA、conditionType的所有取值、key的所有取值、日期范围的2021-08-31这类日期字符串、排序值desc都遗漏了双引号,属于非法JSON格式,服务端无法识别直接返回空结果。 - 部分数值类型如果服务端要求传字符串格式的话也需要包裹双引号,比如
global_bu_id的取值11在参考代码里就是用双引号包裹的。
修复后的正确请求体写法
直接按照参考代码的格式修正reqBody的内容即可,VBA里字符串转义需要用两个双引号代表一个实际的双引号,所有JSON要求的字符串字段和值都用转义后的双引号包裹:
Dim strUrl As String Dim reqBody As String 'For search GOSS service API-Step1 strUrl = "https://gossrepo.ins.dell.com/gossv3/api/reporting/service/getrefid" 'create a method for calling HTTP services Set hReq = CreateObject("MSXML2.XMLHTTP") With hReq .Open "POST", strUrl, blnAsync, False ' 修正后的合法JSON请求体,所有字符串都用转义的双引号包裹 reqBody = "{""methodType"":""extract"",""sourceApplication"":""DSA"",""searchParameter"":[{""conditionType"":""term"",""key"":""global_bu_id"",""value"":""11""},{""conditionType"":""wildcard"",""key"":""customer_num"",""value"":[530007546697]},{""conditionType"":""range"",""key"":""order_date"",""value"":[{""from"":""2021-08-31"",""to"":""2021-09-09""}]},{""conditionType"":""sort"",""key"":""order_date_time"",""value"":""desc""}],""pageSize"":40,""pageNum"":0}" .SetRequestHeader "Content-type", "application/json" .Send reqBody While hReq.ReadyState <> 4 DoEvents Wend ' 新增状态码校验逻辑,排除请求层面错误 If hReq.Status = 200 Then strResponse = hReq.ResponseText Debug.Print strResponse Else Debug.Print "请求错误,状态码:" & hReq.Status & ",错误信息:" & hReq.StatusText End If End With Set Json = JsonConverter.ParseJson(strResponse)
额外排查建议
如果修改后还是返回空,可以按以下步骤排查:
- 打印发送前的
reqBody内容,复制到Postman里直接发送,验证请求体本身是否合法 - 如果Postman请求带了额外的鉴权头、代理配置,需要对比Postman的请求头,把缺失的头信息比如
Authorization、User-Agent等通过SetRequestHeader补充到VBA请求里 - 确认VBA运行环境是否在公司内网,是否可以正常访问目标接口域名
内容的提问来源于stack exchange,提问作者Raiden Choong
相关产品推荐
相关产品推荐

