与vbaparsingJSON时出错

我可以从Web查询中得到一个有效的JSONstring,但是,我无法正确设置项目的生活。 需要确认我没有失去我的想法…

'Call for available reports Dim URLReporta As String Dim JSONa As Object Dim var As Object Set myrequesta = CreateObject("winhttp.winhttprequest.5.1") URLReporta = ("https://secure.saashr.com:443/ta/rest/v1/reports?type=Saved&company%3shortname=" & Company) myrequesta.Open "GET", URLReporta, False myrequesta.setRequestHeader "Accept", "application/json" myrequesta.setRequestHeader "Authentication", "Bearer " & Token myrequesta.setRequestHeader "Content-Type", "application/json" myrequesta.Send Set JSONa = JsonConverter.ParseJson(myrequesta.responseText) Set var = JSONa("SavedName") Debug.Print var.Count 

我得到一个错误在线Set var = JSONa("SavedName")

运行时错误“424”:需要的对象

myrequesta.responseText值如下:

{“reports”:[“SavedName”:“This Year”,“SettingId”:18959322},{“SavedName”:“Time Off Requests”,“SettingId”:18960210},{“SavedName” ”, “SettingId”:18960209},{ “SavedName”: “花名册”, “SettingId”:18960211},{ “SavedName”: “E / d / T”, “SettingId”:18823042},{ “SavedName”: “TestZDR”, “SettingId”:18957188​​}]}

JsonConverter.ParseJson函数返回的结构不能这样工作。 对于您的特定JSON,它包含3个级别:根级对象只有一个属性reports ,其中包含二级数组,其中包含6个三级对象,具有属性SavedNameSettingId 。 您正尝试从根级对象获取第三级的对象属性值。

首先,您需要获取二级数组,然后遍历它的包含对象的元素,并检索该对象的SavedName属性的值。 这是一个例子:

 'Call for available reports Dim URLReporta As String Dim JSONa As Object Dim var As Object Dim rep As Variant Set myrequesta = CreateObject("winhttp.winhttprequest.5.1") URLReporta = ("https://secure.saashr.com:443/ta/rest/v1/reports?type=Saved&company%3shortname=" & Company) myrequesta.Open "GET", URLReporta, False myrequesta.setRequestHeader "Accept", "application/json" myrequesta.setRequestHeader "Authentication", "Bearer " & Token myrequesta.setRequestHeader "Content-Type", "application/json" myrequesta.Send Set JSONa = JsonConverter.ParseJson(myrequesta.responseText) ' root level object Set var = JSONa("reports") ' second level array For Each rep In var ' third level objects Debug.Print rep("SavedName") ' property "SavedName" value of current third level object Next 

这是输出:

即时

如果你只想得到报告的数量,那么得到数组和元素的数量:

 Debug.Print JSONa("reports").Count 

JSON对象可以被认为是一个字典的集合。 所以你必须遍历SavedName这样的内部值来检索索引位置(一个SavedName值)中的整个字典对象(所有的SavedName值)或特定的string值:

 Public Sub GetJSONRequest() Dim jsonStr As String jsonStr = "{" _ & " ""reports"": [{" _ & " ""SavedName"": ""This Year""," _ & " ""SettingId"": 18959322" _ & " }, {" _ & " ""SavedName"": ""Time Off Requests""," _ & " ""SettingId"": 18960210" _ & " }, {" _ & " ""SavedName"": ""Calc Hours Summary""," _ & " ""SettingId"": 18960209" _ & " }, {" _ & " ""SavedName"": ""roster""," _ & " ""SettingId"": 18960211" _ & " }, {" _ & " ""SavedName"": ""E/D/T""," _ & " ""SettingId"": 18823042" _ & " }, {" _ & " ""SavedName"": ""TestZDR""," _ & " ""SettingId"": 18957188" _ & " }]" _ & " }" Dim JSONa As Object, element As Object, e As Variant, i As Variant, var As Variant Set JSONa = ParseJson(jsonStr) ' DICTIONARY OBJECT Set element = CreateObject("Scripting.Dictionary") Set element = JSONa("reports") ' OUTER DICTIONARY For Each e In element ' INNER COLLECTION OF DICTIONARIES For Each i In e Debug.Print i & " " & e(i) Next i Next e ' STRING VALUE OF FIRST SAVEDNAME VALUE var = JSONa("reports")(1)("SavedName") Debug.Print var Set element = Nothing Set JSONa = Nothing End Sub 

产量

 SavedName This Year SettingId 18959322 SavedName Time Off Requests SettingId 18960210 SavedName Calc Hours Summary SettingId 18960209 SavedName roster SettingId 18960211 SavedName E/D/T SettingId 18823042 SavedName TestZDR SettingId 18957188 This Year 

如果有帮助,这里是你的JSON漂亮的印刷版本:

  { "reports": [{ "SavedName": "This Year", "SettingId": 18959322 }, { "SavedName": "Time Off Requests", "SettingId": 18960210 }, { "SavedName": "Calc Hours Summary", "SettingId": 18960209 }, { "SavedName": "roster", "SettingId": 18960211 }, { "SavedName": "E/D/T", "SettingId": 18823042 }, { "SavedName": "TestZDR", "SettingId": 18957188 }] }