VBA调用IBB iSpark ParkDetay API返回空值及报错问题求助
问题排查与解决:调用IBB iSpark ParkDetay API返回空值/报错问题
问题概述
调用https://api.ibb.gov.tr/ispark/ParkDetay?id=45接口时,代码添加On Error Resume Next后返回空值,移除该语句则触发“Invalid procedure call or argument”错误,但接口实际有有效数据返回。
核心问题原因
- JSON结构解析错误:该API返回的是数组包裹的单个对象(格式为
[{...}]),而非直接的JSON对象。原代码直接用response("locationName")访问,相当于从数组中按键取值,必然触发错误。 - 数组定义与赋值错误:
parkArray被定义为String类型数组,但需要存储数字、日期等多种类型数据;且ReDim parkArray(0 To 0)后直接赋值parkArray(15),存在数组索引越界问题。 - 错误处理掩盖问题:
On Error Resume Next屏蔽了所有错误,导致无法发现JSON结构解析失败的核心问题,最终所有变量赋值失败返回空值。 - 数据类型强转风险:部分字段可能为空或格式不符合目标类型(如
updateDate的字符串格式),直接赋值给强类型变量会触发错误。
修正后的代码
Sub dataxx() Dim request As New WinHttpRequest request.Open "GET", "https://api.ibb.gov.tr/ispark/ParkDetay?id=45" request.Send If request.Status <> 200 Then MsgBox "请求失败:" & request.ResponseText Exit Sub End If ' 解析JSON响应 Dim response As Variant Set response = JsonConverter.ParseJSON(request.ResponseText) ' 判断是否为数组(API返回数组结构) If Not response Is Nothing And response.Count > 0 Then Dim parkData As Variant Set parkData = response(1) ' 取数组第一个元素(VBA-JSON数组索引从1开始) ' 定义Variant数组存储多类型数据 Dim parkArray() As Variant ReDim parkArray(0 To 15) ' 对应16个字段 ' 赋值并处理可能的空值 parkArray(0) = IIf(IsNull(parkData("locationName")), "", parkData("locationName")) parkArray(1) = IIf(IsNull(parkData("parkID")), 0, parkData("parkID")) parkArray(2) = IIf(IsNull(parkData("parkName")), "", parkData("parkName")) parkArray(3) = IIf(IsNull(parkData("lat")), 0, parkData("lat")) parkArray(4) = IIf(IsNull(parkData("lng")), 0, parkData("lng")) parkArray(5) = IIf(IsNull(parkData("capacity")), 0, parkData("capacity")) parkArray(6) = IIf(IsNull(parkData("emptyCapacity")), 0, parkData("emptyCapacity")) ' 处理日期字段,避免格式错误 Dim updateDateStr As String updateDateStr = IIf(IsNull(parkData("updateDate")), "", parkData("updateDate")) parkArray(7) = IIf(updateDateStr = "", Empty, CDate(updateDateStr)) parkArray(8) = IIf(IsNull(parkData("workHours")), "", parkData("workHours")) parkArray(9) = IIf(IsNull(parkData("parkType")), "", parkData("parkType")) parkArray(10) = IIf(IsNull(parkData("freeTime")), 0, parkData("freeTime")) parkArray(11) = IIf(IsNull(parkData("monthlyFee")), 0, parkData("monthlyFee")) parkArray(12) = IIf(IsNull(parkData("tariff")), "", parkData("tariff")) parkArray(13) = IIf(IsNull(parkData("district")), "", parkData("district")) parkArray(14) = IIf(IsNull(parkData("address")), "", parkData("address")) parkArray(15) = IIf(IsNull(parkData("areaPolygon")), "", parkData("areaPolygon")) ' 可添加后续处理逻辑,比如写入工作表 ' Sheets("Sheet1").Range("A1").Resize(1, 16).Value = parkArray Else MsgBox "未获取到有效数据" End If End Sub
关键修正点
- 针对API返回的数组结构,先通过
response(1)获取单个对象数据; - 将
parkArray改为Variant类型,支持存储多种数据类型; - 用
IIf处理空值,避免因字段为空导致的赋值错误; - 单独处理日期字段,防止字符串格式错误触发转换异常;
- 移除
On Error Resume Next,改为显式判断与错误处理,便于定位问题。
内容的提问来源于stack exchange,提问作者Oguzhan
相关产品推荐
相关产品推荐

