You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:24:12