使用VBA-JSON库解析JSON响应无法访问元素及遍历问题
问题原因
首先明确 VBA-JSON 库的转换规则:
- JSON 键值对对象(
{}包裹结构)会被转换为Scripting.Dictionary类型,仅支持字典对象("键名")的方式取值,不支持点语法直接访问属性 - JSON 数组(
[]包裹结构)会被转换为Collection集合类型,通过集合对象(索引)取值,索引从1开始计数
你触发报错的核心原因有两个:
- 访问了不存在的键:你示例的JSON结构里没有顶级键
dict_pDictionary,直接调用JsonPayload("dict_pDictionary")会触发不存在键的错误 - 错误使用点语法:类似
e.shortName、e.dict_pDictionary的写法不符合Dictionary的调用规则,Dictionary没有对应内置属性,会直接报错
正确实现代码
单个元素取值示例
Dim JsonPayload As Object Set JsonPayload = JsonConverter.ParseJson(req.ResponseText) ' 取第一个员工的employeeId内的id值 MsgBox JsonPayload("employees")(1)("employeeId")("id") ' 取第一个员工的shortName值 MsgBox JsonPayload("employees")(1)("shortName")
遍历所有员工示例
Dim JsonPayload As Object Set JsonPayload = JsonConverter.ParseJson(req.ResponseText) ' 先获取employees对应的集合 Dim empList As Collection Set empList = JsonPayload("employees") Dim emp As Dictionary For Each emp In empList ' 所有属性都通过("键名")方式访问 Debug.Print "员工ID", emp("employeeId")("id") Debug.Print "员工编号", emp("personNumber") Debug.Print "员工简称", emp("shortName") Next
补充注意事项
- 提前引用
Microsoft Scripting Runtime可避免类型声明报错,用迟绑定的话可以把Dictionary、Collection都替换为Object - 不确定节点类型时可以用
TypeName(JsonPayload("键名"))打印判断是Dictionary还是Collection,再对应处理 - 遇到可选键的场景,可以先调用字典的
Exists方法判断键是否存在,示例:If emp.Exists("shortName") Then Debug.Print emp("shortName")
结构参考示意图


内容的提问来源于stack exchange,提问作者Ray Bond
相关产品推荐
相关产品推荐

