【问题标题】:How do you import json data from a url utilizing VBA?如何使用 VBA 从 url 导入 json 数据?
【发布时间】:2017-09-23 06:15:43
【问题描述】:

我有以下 json 数组,您可以通过以下 url 轻松访问:

https://crowdfluttr.firebaseio.com/test/array.json

它有以下输出:

{"-0p":{"date":"2015-01-01","string":"apple","value":1},"-1p":{"date":"2015-02-04","string":"banana","value":50},"-2p":{"date":"2015-02-03","string":"carrot","value":99},"-3p":{"date":"2015-02-02","string":"banana","value":20},"-4p":{"date":"2015-03-01","string":"banana","value":11},"-5p":{"date":"2015-04-01","string":"kiwi","value":23},"-6p":{"date":"2015-05-01","strawberry":"banana","value":10}}

我想从这个 url 中提取这个 json 数据,然后解析它以推送到 microsoft 访问。

我找到了解释如何解析 JSON(Parsing JSONParsing JSON in Excel VBA)但不从 URL 中提取它然后解析它的资源

【问题讨论】:

标签: json excel vba http ms-access


【解决方案1】:

我会使用 XMLHTTP 来下载 JSON。

如需使用 VBA 解析 JSON,请参阅 https://github.com/VBA-tools/VBA-JSON

下载 ZIP 文件。提取JsonConverter.bas。使用您的 VBA 项目打开 Excel 和 VBA 编辑器。在 Project Explorer 中右键单击 VBA 项目,然后单击 Import File.... 浏览到 JsonConverter.bas 文件并导入它。确保您已通过Tools-References 包含对“Microsoft Scripting Runtime”的引用。

使用您的网址的示例:

Sub test()

 Dim httpObject As Object
 Set httpObject = CreateObject("MSXML2.XMLHTTP")

 sURL = "https://crowdfluttr.firebaseio.com/test/array.json"

 sRequest = sURL
 httpObject.Open "GET", sRequest, False
 httpObject.send
 sGetResult = httpObject.responseText

 MsgBox sGetResult

 Dim oJSON As Object
 Set oJSON = JsonConverter.ParseJson(sGetResult)

 For Each sItem In oJSON
  dItemDate = oJSON(sItem)("date")
  sItemString = oJSON(sItem)("string")
  vItemValue = oJSON(sItem)("value")

  MsgBox "Item: " & sItem & " Date: " & dItemDate & " String: " & sItemString & " Value: " & vItemValue
 Next

End Sub

此代码适用于您的示例JSON,例如:

{"-0p":{"date":"2015-01-01","string":"apple","value":1},"-1p":{"date":"2015-02-04","string":"banana","value":50}, ... }

您必须分析从httpObject.responseText 获得的JSON,以调整代码以从其他JSON 结构中获取值。

【讨论】:

    【解决方案2】:

    以防万一有人偶然发现了同样的问题,但需要在获取 responseText 之前先发送参数,您需要稍微调整一下 Axel's answer

    httpObject.Open "POST", sURL, False '// instead of GET, use POST //
    httpObject.SetRequestHeader "Content-Type", "Application/json" '// specify header //
    httpObject.Send "{""param1"":""value1"",""param2"":""value2""}" '// pass parameter //
    sGetResult = httpObject.responseText '// get response //
    

    下一步是使用上面提供的函数对结果进行相同的解析。

    【讨论】:

      【解决方案3】:

      您可以研究答案here,然后查找VBA.CVRAPI,其中包含从 URL 检索数据所需的所有 Json 模块。虽然是为其他目的而创建的,但 Json 模块是通用的,可以轻松重用。

      包含的演示表格证明了这一点。您应该能够将其应用于您的 URL 进行测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多