使用VBA JsonConverter解析加拿大统计局API响应时的数据提取问题
解决加拿大统计局API响应的JSON数据提取问题
你遇到的核心问题其实是返回的JSON最外层是一个数组结构,而你之前的代码直接把它当成单个对象来访问,自然会报错。咱们一步步来修正:
先搞定cansimId的提取
先看你的响应示例,最外层是[ {...} ],也就是一个包含单个对象的数组。所以JsonConverter.ParseJson返回的是一个Collection,你需要先取集合里的第一个元素,再往下访问:
Debug.Print Json(1)("object")("cansimId") ' 这样就能输出304-0014了
再实现遍历指定维度的成员需求
接下来要找dimensionPositionId=2的维度,然后提取它下面所有成员的memberNameEn。我们可以循环遍历dimension数组,找到目标维度后,再遍历它的member集合:
完整修正代码
Dim Request As New MSXML2.XMLHTTP60 Dim Body As String Dim Json As Object Dim mainObj As Object Dim dimension As Object Dim targetDimension As Object Dim member As Object ' 注意这里的Body可以直接用双引号,不用转义成",更易读 Body = "[{""productId"":16100047}]" Request.Open "POST", "https://www150.statcan.gc.ca/t1/wds/rest/getCubeMetadata", False Request.SetRequestHeader "Content-Type", "application/json" Request.send Body ' 解析JSON,返回的是Collection(因为最外层是数组) Set Json = JsonConverter.ParseJson(Request.ResponseText) ' 取数组里的第一个对象 Set mainObj = Json(1)("object") ' 先验证cansimId是否能正常获取 Debug.Print "cansimId: " & mainObj("cansimId") ' 遍历所有维度,找到dimensionPositionId=2的目标维度 For Each dimension In mainObj("dimension") If dimension("dimensionPositionId") = 2 Then Set targetDimension = dimension Exit For End If Next ' 如果找到目标维度,遍历所有成员并输出memberNameEn If Not targetDimension Is Nothing Then Debug.Print "--- Principal statistics 下的成员名称 ---" For Each member In targetDimension("member") Debug.Print member("memberNameEn") Next Else Debug.Print "未找到dimensionPositionId=2的维度" End If
代码说明
- 修正了JSON的访问路径:先通过
Json(1)获取数组的第一个元素,再访问内部的object节点 - 把Body里的
"换成了直接的双引号(VBA里用两个双引号表示一个转义的双引号),代码更易维护 - 增加了维度遍历的逻辑,精准定位到
dimensionPositionId=2的维度,再遍历其成员
这样运行代码后,就能得到你需要的cansimId值,以及"Principal statistics"维度下所有成员的英文名称了。
内容的提问来源于stack exchange,提问作者Grenier
相关产品推荐
相关产品推荐

