&引用;运行时错误';13';:“类型不匹配”;在VBA中使用JIRA API提取JSON

&引用;运行时错误';13';:“类型不匹配”;在VBA中使用JIRA API提取JSON,vba,excel,api,jira,Vba,Excel,Api,Jira,这里的社区是新来的。我已经做了相当多的编程,但我对VBA完全陌生。以前从未使用过它,直到现在,我的任务是将JSON数据从Jira API提取到Excel电子表格中。我一直收到错误“运行时错误'13:类型不匹配”,我不知道为什么。我知道这个错误与传入不正确的类型有关,但我尝试将Json变量更改为字符串,但没有成功。有人有什么想法吗?谢谢 顺便说一下,这只是一个测试API功能的Jira试用实例 Sub test() 'Authenticate the user Dim response As St

这里的社区是新来的。我已经做了相当多的编程,但我对VBA完全陌生。以前从未使用过它,直到现在,我的任务是将JSON数据从Jira API提取到Excel电子表格中。我一直收到错误“运行时错误'13:类型不匹配”,我不知道为什么。我知道这个错误与传入不正确的类型有关,但我尝试将Json变量更改为字符串,但没有成功。有人有什么想法吗?谢谢

顺便说一下,这只是一个测试API功能的Jira试用实例

Sub test()

'Authenticate the user
Dim response As String

With CreateObject("Microsoft.XMLHTTP")
  .Open "POST", "https://apitestsite.atlassian.net/rest/auth/1/session", False, "admin", "password"
  .setRequestHeader "X-Atlassian-Token:", "nocheck"
  .Send
  response = .responseText
End With

'Query through JSON
Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
MyRequest.Open "GET", "https://apitestsite.atlassian.net/rest/api/2/issue/CC-1", False, "admin", "password"
MyRequest.Send

Dim Json As Object
Set Json = JsonConverter.ParseJson(MyRequest.responseText)

MsgBox Json("fields")("summary")

End Sub
更新:这就是我现在的处境。更新了身份验证的代码,现在编译器中没有显示错误。下面是我正在使用的JSONConverter类:github.com/VBA-tools/VBA-JSON/blob/master/JSONConverter.bas。现在的问题是返回的JSON字符串显示“{”errorMessages:[“问题不存在或您没有查看它的权限],“errors:{}”。因此,我能够很好地连接到Jira并以字符串形式返回JSON,只是Jira拒绝了我的凭据:/

Private JiraService As New MSXML2.XMLHTTP60
Private JiraAuth As New MSXML2.XMLHTTP60

Sub test()

'Authenticate the user

With JiraAuth
    .Open "POST", "https://apitestsite.atlassian.net/rest/auth/1/session", False
    .setRequestHeader "Content-Type", "application/json"
    .setRequestHeader "Accept", "application/json"
    .setRequestHeader "X-Atlassian-Token:", "nocheck"
    .send " {""username"" : ""admin"", ""password"" : ""password""}"""
    sErg = .responseText
    sCookie = "JSESSIONID=" & Mid(sErg, 42, 32) & "; Path=/Jira" '*** Extract the Session-ID
End With

With JiraService
    Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
    MyRequest.Open "GET", "https://apitestsite.atlassian.net/rest/api/2/issue/CC-1", False
    MyRequest.setRequestHeader "Content-Type", "application/json"
    MyRequest.setRequestHeader "Accept", "application/json"
    MyRequest.setRequestHeader "Set-Cookie", sCookie '*** see Create a "Cookie"
    MyRequest.send

    Dim Json As String

    Json = MyRequest.responseText

    MsgBox Json
End With

End Sub

这似乎从API返回了一个有效的JSON,可以从
Jsonconverter
模块解析

您使用的
MyRequest
对象可能是错误类型的对象。在其他地方,您依赖的是
MSXML2.XMLHTTP60

Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
因此,我删除了
MyRequest
,改为使用
JiraService
对象。您在JiraService中有一个
块,但实际上根本没有使用该对象,而是针对该块中的
WinHttpRequest
对象执行

我还声明了所有变量,并修改了auth字符串以使用在模块顶部为user/password定义的
Const
字符串

Option Explicit
Private JiraService As New MSXML2.XMLHTTP60
Private JiraAuth As New MSXML2.XMLHTTP60
Const user As String = "jiratestemail82@gmail.com"
Const pw As String = "password"
Sub test()
Dim sErg$, sCookie$, Json$

'Authenticate the user

With JiraAuth
    .Open "POST", "https://apitestsite.atlassian.net/rest/auth/1/session", False
    .setRequestHeader "Content-Type", "application/json"
    .setRequestHeader "Accept", "application/json"
    .setRequestHeader "X-Atlassian-Token:", "nocheck"
    .send " {""username"" : """ & user & """, ""password"" : """ & pw & """}"""
    sErg = .responseText
    sCookie = "JSESSIONID=" & Mid(sErg, 42, 32) & "; Path=/Jira" '*** Extract the Session-ID
End With

With JiraService
    .Open "GET", "https://apitestsite.atlassian.net/rest/api/2/issue/CC-1", False
    .setRequestHeader "Content-Type", "application/json"
    .setRequestHeader "Accept", "application/json"
    .setRequestHeader "Set-Cookie", sCookie '*** see Create a "Cookie"
    .send
    Json = .responseText
End With

Dim j As Object
Set j = JsonConverter.ParseJson(Json)
MsgBox j("fields")("summary")

End Sub

这似乎从API返回了一个有效的JSON,可以从
Jsonconverter
模块解析

您使用的
MyRequest
对象可能是错误类型的对象。在其他地方,您依赖的是
MSXML2.XMLHTTP60

Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
因此,我删除了
MyRequest
,改为使用
JiraService
对象。您在JiraService中有一个
块,但实际上根本没有使用该对象,而是针对该块中的
WinHttpRequest
对象执行

我还声明了所有变量,并修改了auth字符串以使用在模块顶部为user/password定义的
Const
字符串

Option Explicit
Private JiraService As New MSXML2.XMLHTTP60
Private JiraAuth As New MSXML2.XMLHTTP60
Const user As String = "jiratestemail82@gmail.com"
Const pw As String = "password"
Sub test()
Dim sErg$, sCookie$, Json$

'Authenticate the user

With JiraAuth
    .Open "POST", "https://apitestsite.atlassian.net/rest/auth/1/session", False
    .setRequestHeader "Content-Type", "application/json"
    .setRequestHeader "Accept", "application/json"
    .setRequestHeader "X-Atlassian-Token:", "nocheck"
    .send " {""username"" : """ & user & """, ""password"" : """ & pw & """}"""
    sErg = .responseText
    sCookie = "JSESSIONID=" & Mid(sErg, 42, 32) & "; Path=/Jira" '*** Extract the Session-ID
End With

With JiraService
    .Open "GET", "https://apitestsite.atlassian.net/rest/api/2/issue/CC-1", False
    .setRequestHeader "Content-Type", "application/json"
    .setRequestHeader "Accept", "application/json"
    .setRequestHeader "Set-Cookie", sCookie '*** see Create a "Cookie"
    .send
    Json = .responseText
End With

Dim j As Object
Set j = JsonConverter.ParseJson(Json)
MsgBox j("fields")("summary")

End Sub

哪一行引发了错误?另外,您可能希望包含
JsonConverter
类的代码,因为大多数用户都无法正常引用。您是否检查了响应是否为预期结果?可能是由于错误状态而返回HTML响应?谢谢您的回复!编译器说错误发生在最后一行“msgboxjson(“fields”)(“summary”)”。我可能只是在错误地过滤JSON吗?我将用JsonConverter类更新我的问题。忽略上面的POSTMAN注释,只是想表明我用于代码的凭据可以访问API。就重新创建我的场景而言,我通过VBA提供的代码没有太多其他内容。如果您想访问Jira实例或应该显示的JSON,可以使用“jiratestemail82@gmail.com密码为“password”。从那里,您可以在另一个浏览器选项卡中键入“”,以查看该特定API调用的JSON。哪一行会引发错误?此外,您可能希望包含
JsonConverter
类的代码,因为大多数用户都无法正常引用该类。如果响应是预期结果,您是否检查了响应?可能是由于错误状态而返回HTML响应?谢谢您的回复!编译器说错误发生在最后一行“msgboxjson(“fields”)(“summary”)”。我可能只是在错误地过滤JSON吗?我将用JsonConverter类更新我的问题。忽略上面的POSTMAN注释,只是想表明我用于代码的凭据可以访问API。就重新创建我的场景而言,我通过VBA提供的代码没有太多其他内容。如果您想访问Jira实例或应该显示的JSON,可以使用“jiratestemail82@gmail.com密码为“password”。从那里,您可以在另一个浏览器选项卡中键入“”,以查看该特定API调用的JSON。您太棒了!我很快就要让它工作了,但我想用错误的方法来解决它。也感谢您描述它的工作原理。非常感谢,非常感谢!你太棒了!我很快就要让它工作了,但我想用错误的方法来解决它。也感谢您描述它的工作原理。非常感谢,非常感谢!