这是我想要解析的用户表的JSON视图中的示例",其中包含aliasList
作为HTML表格中每列的标题,其余用户位于其下方。
{"totalCount":431,"messages":[],"results":[{"aliasList":["User Id","Name","last name"],"results":[[71512,"joe","adams"],[23445,"jack","wilson"],[34566,jill,goodman]],"executionDate":151134568428}],"Class":"com.zoho.controlpanel.reports.ReportsItemVO"}
这是我的解析调用者得到编译错误:
For Each只能遍历集合对象或数组
Public Sub exceljson()
Dim http As Object, JSON As Object, i As Integer
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "http://controlpanel.zoho.verio/rest/reports/search/NONE&offset=0", False
http.send
Set JSON = ParseJson(http.responseText)
i = 2
Dim data As String
data = JSON("results")(2)
Dim parsedData As Dictionary
Set parsedData = ParseJson(data)
For Each item In data
Sheets(5).Cells(i, 1).Value = item("results")(2) 'key is called simply "2"
Sheets(5).Cells(i, 2).Value = item("results")(4)
Sheets(5).Cells(i, 3).Value = item("results")(6)
Sheets(5).Cells(i, 4).Value = item("results")(13)
Sheets(5).Cells(i, 5).Value = item("results")(16)
Sheets(5).Cells(i, 6).Value = item("results")(18)
i = i + 1
Next
MsgBox ("complete")
End Sub
我在数据声明中尝试了很多组合,哪些嵌套数组要解析而没有成功。但是,我不知道在这种情况下我是否需要使用aliasList
,我不知道该怎么做。
我应该在通话中修改什么?
答案 0 :(得分:1)
这部分代码说data
是一个字符串:
Dim data As String
data = JSON("results")(2)
因此,它不可迭代。尝试将data
设为其他内容并进行迭代。这是迭代string
:
Option Explicit
Public Sub TestMe()
Dim data As String
Dim somethingElse As Variant
data = "How much should I party today?"
somethingElse = Split(data)
Dim cnt As Long
For cnt = LBound(somethingElse) To UBound(somethingElse)
Debug.Print somethingElse(cnt)
Next cnt
End Sub
答案 1 :(得分:1)
您的JSON格式不正确,因为您只能拥有每个唯一键的一个实例。 当第二个"结果"解析它只会覆盖第一个。
这对我有用(在修复JSON中的错误之后):
Dim j, k, o
'loading json from worksheet cell...
Set j = JsonConverter.ParseJson(Sheet1.Range("B6").Value)
For Each o In j("results")
Debug.Print o("1"), o("2"), o("3")
Next
编辑:为您的"实际"更新JSON:
Sub Tester55()
Dim j, c, res, v
'loading json from worksheet cell...
Set j = JsonConverter.ParseJson(Sheet1.Range("B6").Value)
Set res = j("results")
Set c = ActiveSheet.Range("F2")
WriteCollection c, res(1)("aliasList")
For Each v In res(1)("results")
Set c = c.Offset(1, 0)
WriteCollection c, v
Next v
End Sub
Sub WriteCollection(rng, col)
Dim v, i As Long
For Each v In col
rng.Offset(0, i).Value = v
i = i + 1
Next v
End Sub