我正在使用下面的链接中的VBA-JSON模块,从那里捕获天气信息的来源已经从每小时列出的7天数据的列表 struct 变成了每天的数组,并且每一天都有另一个小时array.

这是我作为Marco导入到VBA中的模块. https://github.com/VBA-tools/VBA-JSON

Forecastday and Hour是一个集合对象当使用这个VBA-JSON库进行转换时,我不熟悉VBA...我应该如何纠正for循环中的两行以使数据显示得像附加的图像一样?(这是系统在http源代码更改之前的工作方式)

http://api.weatherapi.com/v1/forecast.json?key=4c6f7219367f4aa5b0c174927231104&q=51.180224,-113.9385224&days=7&aqi=no&alerts=no

enter image description here

Public Sub exceljson()

Dim http As Object, JSON As Object, i As Integer

Set http = CreateObject("MSXML2.XMLHTTP")

http.Open "GET", "http://api.weatherapi.com/v1/forecast.json?key=4c6f7219367f4aa5b0c174927231104&q=51.180224,-113.9385224&days=7&aqi=no&alerts=no", False
http.Send

Set JSON = JsonConverter.ParseJson(http.responseText)

For i = 4 To 169

Sheets("Setup").Cells(i, 1).Value = JSON("forecast")("forecastday")("hour")(i)("time_epoch")
Sheets("Setup").Cells(i, 2).Value = JSON("forecast")("forecastday")("hour")(i)("temp_c")

Next

End Sub

enter image description here (expected excel results)

循环中的以下两行是执行时生成错误的地方.

For i = 4 To 169

Sheets("Setup").Cells(i, 1).Value = JSON("forecast")("forecastday")("hour")(i)("time_epoch")
Sheets("Setup").Cells(i, 2).Value = JSON("forecast")("forecastday")("hour")(i)("temp_c")

Next.

但我不确定如何处理嵌套的集合对象.是否应该有(J)和(I)?J代表<8,代表一周的天数?我读到JSON Converter for VBA会将任何[]值转换为VBA集合对象.

无论我try 什么,要么给出运行时错误5,要么给出运行时错误13.

这是否应该是预期的格式?但它在调试时不被接受.我认为预报日应该在一周内循环7次,然后每一天都应该有一个小时循环,一天中的24小时?不确定如何在VBA中实现这一点.

JSON("forecast")("forecastday")(j)("hour")(i)("temp_c")

请帮帮忙,我该怎么做呢?我将预期结果附加到一个名为"(Expect EXCEL RESULTS)"的图像中,对于一个名为"Setup"的选项卡,从第4行开始的列A记录了纪元时间戳条目,列B是当天的预测温度,每小时预测一次.

推荐答案

因为forecastday实际上是一个集合,而不是字典,你需要循环通过7天,然后是24小时.因此,考虑一个具有行和列迭代器的嵌套循环.Below返回hourall个元素,但嵌套的condition除外.

Public Sub exceljson()
On Error GoTo ErrHandle
    Dim http As Object, JSON As Object
    Dim currHour As Dictionary
    Dim k As Variant
    Dim i As Long, j As Long, row As Long, col As Long

    Set http = CreateObject("MSXML2.XMLHTTP")
    
    http.Open "GET", "http://api.weatherapi.com/v1/forecast.json?key=4c6f7219367f4aa5b0c174927231104&q=51.180224,-113.9385224&days=7&aqi=no&alerts=no", False
    http.Send
    
    Set JSON = JsonConverter.ParseJson(http.responseText)

    row = 2
    For i = 1 To JSON("forecast")("forecastday").Count
        For j = 1 To JSON("forecast")("forecastday")(i)("hour").Count
            Set currHour = JSON("forecast")("forecastday")(i)("hour")(j)
            col = 1
            For Each k In currHour.Keys
                If row = 2 Then
                    Sheets("Setup").Cells(1, col) = k               ' HEADER
                End If
                If k <> "condition" Then
                    Sheets("Setup").Cells(row, col) = currHour(k)   ' DATA
                    col = col + 1
                End If
            Next k
            row = row + 1
        Next j
    Next i
    
ExitHandle:
    Set currHour = Nothing: Set JSON = Nothing: Set http = Nothing
    Exit Sub

ErrHandle:
    MsgBox Err.Number & ": " & Err.Description, vbCritical, "RUNTIME ERROR"
    Resume ExitHandle
End Sub

输出

Excel 输出

Json相关问答推荐

盒子图显示不正确

属性错误:';ActivitiesClient';对象没有属性';base_url';

Pandas 对REST API的自定义响应

迭代powershell双维json对象

Android 如何判断小时时间是否在两个时间之间?

Jolt规范:将嵌套数组中的null元素移除

如何通过 jolt 将一个对象中的键和值添加到数组中的每个对象中

JOLT 获取带有动态键的数组

将具有多个级别的 json 读入 DataFrame [python]

使用 System.Text.Json 序列化记录成员

TSQL FOR JSON 嵌套值

序列化为json时如何忽略空列表?

如何在golang中获取 struct 的json字段名称?

编写 JSON 日志(log)文件的格式?

Json.Net:用于自定义命名的 JsonSerializer-Attribute

JSON 到 JSON 转换器

TypeError: b'1' 不是 JSON 可序列化的

JSON 使用 simplejson 序列化 Django 模型

带有 Jackson 的不可变 Lombok 注释类

在android中使用GSON解析带有动态key和value的JSON