VBA解析JSON数据

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

我试图解析网站上的JSON数据。我成功获取了JSON字符串,但我无法解析它。以下代码中抛出异常:

运行时错误424.对象必需

这是我的代码:

' Download string from URL
Public Function DownloadDataFromURL(url As String) As String
    Set Myrequest = CreateObject("WinHttp.WinHttpRequest.5.1")
    Myrequest.Open "GET", url
    Myrequest.send
    Dim WebResponse As String
    WebResponse = Myrequest.responseText
    Cells(1, 1).Value = WebResponse
    DownloadDataFromURL = WebResponse
End Function

' Download all cryptocoins in
Public Sub LoadCryptocoins()
    Dim Path As String
    Dim Data As String
    Dim json As Object

    Path = "https://api.coinmarketcap.com/v1/ticker/"
    Data = DownloadDataFromURL(Path)

    Set jp = New JsonParser
    Set jo = jp.Decode(Data)

    For Each Item In jp.EnumKeys(jo)
        MsgBox (Item.GetValue(jo, "id")) 'The exception is thrown here
    Next
End Sub

我在这里使用JSON Parser:Parsing JSON in Excel VBA

我可以在这里找到原始JSON数据:https://api.coinmarketcap.com/v1/ticker/

如何获得每个硬币名称和美元价格?

json excel vba
4个回答
2
投票

试试下面的脚本。它会获取您提到的所有数据。无需外部解析器即可实现此目的:

Sub coinmarketcap_data()
    Dim http As New XMLHTTP60, res As Variant

    With http
        .Open "GET", "https://api.coinmarketcap.com/v1/ticker/", False
        .send
        res = .responseText
    End With

    For r = 1 To UBound(Split(res, "id"": """))
        Cells(r, 1) = Split(Split(Split(res, "name"": """)(r), """symbol")(0), """")(0)
        Cells(r, 2) = Split(Split(Split(res, "price_usd"": """)(r), """price_btc")(0), """")(0)
    Next r
End Sub

参考添加到库:

Microsoft XML, v6.0

1
投票

从Excel 2010版本开始,您可以下载加载项“Power Query”,或者如果您有2016版本,它在Excel中默认为“Get&Transform”。你可以轻松地提取数据,在你的情况下它将是:

  1. 去数据
  2. 选择“来自网络”

  1. 添加JSON网址

它将打开ETL excel工具(查询编辑器):

  1. 去“变换”
  2. 选择“To Table”
  3. 我没有更改任何参数>确定

7.单击带有两个箭头的角落,然后选择所需的字段。

  1. 有很多工具可以使用这些数据。然后转到“主页”并选择“关闭并加载”它将创建一个包含数据的新工作表。

如果您只想复制和粘贴,这是“高级编辑器”代码:

let
    Source = Json.Document(Web.Contents("https://api.coinmarketcap.com/v1/ticker/")),
    #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"id", "name", "symbol", "rank", "price_usd", "price_btc", "24h_volume_usd", "market_cap_usd", "available_supply", "total_supply", "max_supply", "percent_change_1h", "percent_change_24h", "percent_change_7d", "last_updated"}, {"Column1.id", "Column1.name", "Column1.symbol", "Column1.rank", "Column1.price_usd", "Column1.price_btc", "Column1.24h_volume_usd", "Column1.market_cap_usd", "Column1.available_supply", "Column1.total_supply", "Column1.max_supply", "Column1.percent_change_1h", "Column1.percent_change_24h", "Column1.percent_change_7d", "Column1.last_updated"})
in
    #"Expanded Column1"

1
投票

您得到的例外是因为您解析的JSON对象jo是一个集合,因此您必须首先遍历集合项,然后才能访问每个项的键和值。

我不知道你正在使用什么解析器,所以我将使用VBA-JSON回答:

Public Sub LoadCryptocoins()
    Dim Path As String
    Dim Data As String
    Dim json As Object

    Path = "https://api.coinmarketcap.com/v1/ticker/"
    Data = DownloadDataFromURL(Path)

    Set json = JsonConverter.ParseJson(Data)
    For Each Item In json
        MsgBox (Item("name") & " $" & Item("price_usd"))
    Next
End Sub

现在,使用你的解析器,我想它应该是这样的:

Public Sub LoadCryptocoins()
    Dim Path As String
    Dim Data As String
    Dim json As Object

    Path = "https://api.coinmarketcap.com/v1/ticker/"
    Data = DownloadDataFromURL(Path)

    Set jp = New JsonParser
    Set jo = jp.Decode(Data)

    For Each Item In jo
        MsgBox (Item.GetValue(jo, "name") & " $" & Item.GetValue(jo, "price_usd"))
    Next
End Sub

但这是在黑暗中完全盲目的。一旦你发布了一个你正在使用的解析器的链接,我可以更新我的答案。


0
投票

使用https://github.com/VBA-tools/VBA-JSON的简单示例

Public Sub LoadCryptocoins()

    Dim Path As String
    Dim Data As String
    Dim jo As Object, o
    Dim i As Long

    Path = "https://api.coinmarketcap.com/v1/ticker/"
    Data = DownloadDataFromURL(Path)

    Set jo = json.parse(Data)

    For i = 1 To jo.Count
        Set o = jo(i)
        Debug.Print o("id")
    Next i

End Sub

如果JSON响应表示数组,则json.parse的返回值将为Collection,如果是对象,则为Scripting Dictionary。

© www.soinside.com 2019 - 2024. All rights reserved.