JSON в Excel (многоуровневый) - PullRequest
       5

JSON в Excel (многоуровневый)

0 голосов
/ 30 октября 2018

Я знаю, как анализировать JSON в Excel с VBA, но у меня проблема с многоуровневым JSON.

Пример:

{
"Level1": [{
    "String1": "Data1",
    "Level 2": [{
        "String2": "Data2",
        "String3": "Data3",
        "Level3": [{
            "String4": "Data4",
            "String5": "Data5"
        }]
    }]
 }]
}

Как все достать?

1 Ответ

0 голосов
/ 30 октября 2018

{ означает словарь, к которому вы обращаетесь по ключу, [ означает коллекцию, поэтому вы получаете доступ по индексу. "" означает строковый литерал, поэтому вы читаете как есть. Проверьте тип данных и обработайте, как требуется. Ниже я использую JSON-анализатор для чтения строки JSON из ячейки A1. После добавления .bas из этой ссылки в ваш проект вы затем добавляете ссылку через VBE> Инструменты> Ссылки> Microsoft Scripting Runtime.

Я использую подпрограмму EmptyDict, которую я вызываю рекурсивно, чтобы проверить, является ли текущий объект словарем или коллекцией, а затем зацикливаться, пока я не опустошу каждый словарь. Для каждой коллекции я сдвигаю один столбец вправо.

Как уже упоминалось в комментариях, вы должны настроить выходной формат на листе.


Древовидная структура, по которой вы спускаетесь, выглядит следующим образом:

enter image description here


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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...