Json到Excel(多级)

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" }]

我知道如何用VBA将JSON解析为Excel,但我对多级JSON有一个问题

例如:

{
"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谢谢。我必须先了解一下,然后开始引用打电话给我。