在Excel VBA中解析JSON,并按键访问数组。

问题描述 投票:1回答:1

我想从一个网站上搜刮内容(链接)使用Excel VBA。下面是来自服务器的.json响应(链接):

{
  "TopicDetails": {
    "type": 0,
    "ccm2Id": 31088568,
    "cftId": 0,
    "identifier": "FETOPEN-01-2018-2019-2020",
    "title": "FET-Open Challenging Current Thinking",
    "actions": [
      {
        "status": {
          "id": 31094502,
          "abbreviation": "Open",
          "description": "Open"
        },
        "types": [
          "RIA Research and Innovation action"
        ],
        "plannedOpeningDate": "07 November 2017",
        "submissionProcedure": {
          "id": 31094504,
          "abbreviation": "multiple cut-off",
          "description": "multiple cut-off"
        },
        "deadlineDates": [
          "16 May 2018",
          "24 January 2019",
          "18 September 2019",
          "03 June 2020"
        ]
      }
    ]
  }
}

为此,写了一个宏,效果很好。然而,我在访问存储在块 "actions "中的信息时遇到了困难(特别是 "type "键和最新截止日期的数据)。错误信息是 "Subscript out of range"。

以下是我代码的相关部分。

Private Sub getJson()

Dim http As Object
Dim JSON As Object
Dim response As String
Dim url As String
Dim id As String
Dim oTarget As Object

id = "FETOPEN-01-2018-2019-2020"
url = "https://ec.europa.eu/info/funding-tenders/opportunities/data/topicDetails/" & LCase(id) & ".json?lang=en"

Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", url, False
http.send
response = http.responseText

Set JSON = JsonConverter.ParseJson(response)

'--- WORKS ---
Cells(5, 11).Value = JSON("TopicDetails")("title")

'--- DOESN'T WORK ---
'--- Test 1 ---
Cells(5, 17).Value = JSON("TopicDetails")("actions")("types")
'--- Test 2 ---
Cells(5, 18).Value = JSON("TopicDetails")("actions")(0)
'--- Test 3 ---
Cells(5, 19).Value = JSON("TopicDetails")("actions")(0)("types")
'--- Test 4 ---
Set oTarget = JSON("TopicDetails")("actions")
With oTarget
    Cells(5, 18).Value = .item(0).item(0)
End With

End Sub

当我试图接近 "动作 "数组的元素时,我发现,下面的代码将1作为答案(这是有意义的)。

Set oTarget = JSON("TopicDetails")("actions")
Cells(5, 18).Value = oTarget.count

同时,当我试图接近数组的下一级时,下面的代码给出了一个错误("Subscript out of range"),而不是像人们所期望的那样,给出了一个5。

Set oTarget = JSON("TopicDetails")("actions")(0)
Cells(5, 18).Value = oTarget.count

如何提取 "RIA研究和创新行动"(键为 "类型")和最新截止日期2020年6月3日(键为 "deadlineDates")的信息?

先谢谢你! 任何帮助是非常感激的

马克西姆

json vba web-scraping jsonconverter
1个回答
1
投票

这是因为数据类型 "type "是数组。

根据VBA-JSON示例 https:/github.comVBA-toolsVBA-JSON。 数组索引从1开始。

试试这个。

Cells(5, 19).Value = JSON("TopicDetails")("actions")(1)("types")(1)
© www.soinside.com 2019 - 2024. All rights reserved.