Json到Excel(多级)
我知道如何用VBA将JSON解析为Excel,但我对多级JSON有一个问题 例如:Json到Excel(多级),json,excel,vba,Json,Excel,Vba,我知道如何用VBA将JSON解析为Excel,但我对多级JSON有一个问题 例如: { "Level1": [{ "String1": "Data1", "Level 2": [{ "String2": "Data2", "String3": "Data3", "Level3": [{ "String4": "Data4", "String5": "Data5" }]
{
"Level1": [{
"String1": "Data1",
"Level 2": [{
"String2": "Data2",
"String3": "Data3",
"Level3": [{
"String4": "Data4",
"String5": "Data5"
}]
}]
}]
}
如何获取所有内容?这个
{
表示一个字典,您可以通过键进行访问,[
表示一个集合,您可以通过索引进行访问。“
表示字符串文字,因此可以按原样读取。根据需要测试数据类型和句柄。下面我使用a从单元格A1中读取JSON字符串。在将.bas
从该链接添加到项目后,您可以通过VBE>工具>引用>Microsoft脚本运行时添加引用
我使用一个子EmptyDict
,递归调用它来测试当前对象是字典还是集合,然后循环直到清空每个字典。对于每个集合,我向右移动一列
如评论中所述,您可以根据工作表中所需的输出格式进行定制
正在下降的树结构如下所示:
Option Explicit
Public r As Long, c As Long
Sub readValues()
Dim json As Object, item As Object
Set json = JsonConverter.ParseJson([A1])("Level1")(1) 'dictionary
r = 1: c = 1
EmptyDict json
End Sub
Public Sub EmptyDict(ByVal dict As Object)
Dim key As Variant, item As Object
Select Case TypeName(dict)
Case "Collection"
For Each item In dict
c = c + 1
r = 1
EmptyDict item
Next
Case "Dictionary"
For Each key In dict
If TypeName(dict(key)) = "Collection" Then
EmptyDict (dict(key))
Else
With ThisWorkbook.Worksheets("Sheet2")
.Cells(r, c) = dict(key)
End With
r = r + 1
End If
Next
End Select
End Sub
VBA:
Option Explicit
Public r As Long, c As Long
Sub readValues()
Dim json As Object, item As Object
Set json = JsonConverter.ParseJson([A1])("Level1")(1) 'dictionary
r = 1: c = 1
EmptyDict json
End Sub
Public Sub EmptyDict(ByVal dict As Object)
Dim key As Variant, item As Object
Select Case TypeName(dict)
Case "Collection"
For Each item In dict
c = c + 1
r = 1
EmptyDict item
Next
Case "Dictionary"
For Each key In dict
If TypeName(dict(key)) = "Collection" Then
EmptyDict (dict(key))
Else
With ThisWorkbook.Worksheets("Sheet2")
.Cells(r, c) = dict(key)
End With
r = r + 1
End If
Next
End Select
End Sub
{表示通过键访问的字典,[表示通过索引访问的集合。“”表示按原样读取的字符串文字。根据需要测试数据类型和句柄。现在回答这个问题吗?注意,Tim的VBA/JSON工作现在已分发,这使得JSON解析器很容易保持最新-就像在.NET项目中使用Nuget包一样。@MathieuGuindon谢谢。我必须先了解一下,然后开始引用打电话给我。