【问题标题】:Using VB or VBA To Get JSON Responds from Http Request使用 VB 或 VBA 从 Http 请求中获取 JSON 响应
【发布时间】:2018-11-24 16:03:23
【问题描述】:

我刚刚发布了关于使用 VBA 的 HTTP GET 请求的问题,并且我刚刚使用前一篇文章中给我的建议解决了这个问题。我从“SetRequestHeader”中取出“Basic”,并且能够看到数据。由于我的数据是 JSON 格式,我必须正确请求数据并将其存储到文本文件中。

在我的代码中,我将 P = JSON.parse(XMLHttpReq.responseText) 设置为未定义,我应该在这段代码中定义什么 JSON?由于这个问题,我无法运行它。

如果有人对此或其他建议有任何问题,请告诉我!

我在下面添加了一些 VBA 代码来处理请求。

Sub Test()
    Dim sUrl As String, sAuth As String
    Dim P As Object
    Dim XMLHttpReq As MXXML2.ServerXMLHTTP

    sUrl = "https://api.ngs.nfl.com/tracking/game/play?gameKey=57444&playId=51"
    sAuth = "NGS AKIAIX2CQ7IEOKPOTKDQ:uNniaOp4jH8jcK9i/EtQhurlilc="

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", sUrl, False
        .setRequestHeader "Authorization", "Basic " & sAuth
        .send

        If XMLHttpReq.ReadyState = 4 Then
             If XMLHttpReq.Status = 200 Then

                  ' Process the JSON response here

                  Debug.Print "200 received"
                  Set P = JSON.parse(XMLHttpReq.responseText)
             Else
                  If XMLHttpReq.Status = 404 Then
                       ' Handle it
                  End If
             End If

        Debug.Print .getAllResponseHeaders
    End With
End Sub

【问题讨论】:

  • 如果您需要将数据转换为二维数组或显示在工作表上,请查看this solution

标签: json vba http ms-access xmlhttprequest


【解决方案1】:

对于我得到的未经授权的响应,我使用了JSONConverter 并将响应文本转换为 JSON 对象。对于我得到的响应,我将展示如何访问返回的消息。

注意:您需要将 JSONConverter .bas 添加到项目中,然后转到 VBE > Tools >References 并添加对 Microsoft Scripting Runtime 的引用。

Option Explicit   
Public Sub Test()
    Dim sUrl As String, sAuth As String

    Dim XMLHttpReq As MSXML2.ServerXMLHTTP60

    sUrl = "https://api.ngs.nfl.com/tracking/game/play?gameKey=57444&playId=51"
    sAuth = "NGS AKIAIX2CQ7IEOKPOTKDQ:uNniaOp4jH8jcK9i/EtQhurlilc="

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", sUrl, False
        .setRequestHeader "Authorization", sAuth
        .send

        Dim P As Object, key As Variant
        Set P = JsonConverter.ParseJson(.responseText)
        WriteTextFile .responseText
        For Each key In P.Keys
            Debug.Print key & " : " & P(key)
        Next key
    End With
End Sub

Public Sub WriteTextFile(ByVal htmlResponse As String)
    Dim fso As Object, f As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.CreateTextFile("C:\Users\User\Desktop\info.txt", True, True)
    f.Write htmlResponse
    f.Close
End Sub

编辑:

Option Explicit
Public Sub Test()
    Dim sUrl As String, sAuth As String, XMLHttpReq As MSXML2.ServerXMLHTTP60
    sUrl = "https://api.ngs.nfl.com/tracking/game/play?gameKey=57444&playId=51"
    sAuth = "NGS AKIAIX2CQ7IEOKPOTKDQ:uNniaOp4jH8jcK9i/EtQhurlilc="

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", sUrl, False
        .setRequestHeader "Authorization", sAuth
        .send
        WriteTextFile .responseText, "C:\Users\User\Desktop\info.txt"
    End With
End Sub

Public Sub WriteTextFile(ByVal htmlResponse As String, ByVal fileName As String)
    Dim fso As Object, f As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.CreateTextFile(fileName, True, True)
    f.Write htmlResponse
    f.Close
End Sub

【讨论】:

  • 您指出错误,您是正确的。我从.SetRequestHeader“Authorization”中取出了关键词“Basic”,sAuth就是得到结果的关键。我在执行 Debug.Print ResponseText 时看到了结果。我看到的数据如下所示:31:13.800","x":34.22,"y":46.31,"z":0,"s":0,"a":0,"dis":0, "o":1.61,"dir":294.06,"isOnField":true},{"time":"2017-12-17T01:31:13.900","x":34.22,"y":46.32,"z ":0,"s":0,"a":0,"dis":0,"o":1.62,"dir":294.85,"isOnField":true},我继续
  • 我之前的评论是我使用 Debug.Print ResponseText 得到的示例有没有办法不使用 JSON 来获取所有数据并将其保存在文件中?这对我有用,我只是想将它们复制并粘贴到 txt 文件中。我从响应正文窗口手动连接和复制。我看到的数据不是从一开始的。你有什么建议吗?有没有办法获得开始和所有的内容?还是我必须一次获得小组?我也下载了VBA-JSON V2.3.0 你用的是这个版本吗?
  • 您能帮我将输出写入文本文件吗?还是我必须创建一个新帖子???谢谢
  • 我添加了一个写入文本文件的示例。您可以修改底部 sub 以接受第二个参数,该参数可以是另存为文件名,而不是硬编码的当前文件名。
  • 这有意义吗?