Разбор JSON прямо в массив - PullRequest
0 голосов
/ 11 марта 2020

Сценарий: Я использую некоторые функции для получения данных с веб-сайта с помощью VBA. Эти функции в настоящее время считывают данные в файл JSON и при дальнейшей обработке вставляют их в лист.

Проблема: Необходимость каждый раз очищать и записывать в листы новый JSON извлекается препятствует выполнению кода.

Вопрос: Можно ли было бы проанализировать данные внутри объекта JSON непосредственно в массив Variant, чтобы любые операции с ним сделаны в памяти?

Что я уже пробовал: В продолжение некоторых онлайн-исследований я обнаружил Синтаксический анализ Json массива через VBA и http://excelerator.solutions/2017/08/16/import-json-to-excel-using-vba/ и некоторые другие страницы. Во всех этих случаях данные сначала анализируются в таблице или непосредственно в листе, но не в массиве. Я попытался изменить свою функцию, которая записывает JSON в лист, путем анализа таблицы, но для этого по-прежнему требуется мне нужно выполнить шаг «вставить на лист», прежде чем читать его в массив.

Функция, с которой я работаю: Когда я вызываю эту функцию, мой JSON файл уже получен и хранится в памяти. Кроме того, способ, которым это работает, заключается в итеративном разборе каждого смещения, которое будет эквивалентно строкам массива. Моя идея состояла в том, чтобы вообще пропустить это, так как непосредственно разбираем jSON .:

Public Sub WriteJsonToSheet(s As Worksheet, j As JSON, Optional ByVal fields As Variant, Optional rowOffset As Long = 0)
    If (rowOffset = 0) Then
    Dim loopvar1 As Long, loopvar2 As Long
        With s.UsedRange
            .ClearFormats
            .ClearContents
            .ClearComments
            .ClearHyperlinks
            .ClearOutline
            .ClearNotes
        End With                                 's.UsedRange.Clear
    End If
    If j.count = 0 Then Exit Sub

    ' get the list of all the fields in the -first- record
    If IsMissing(fields) Then
        fields = j.item("0.$").GetKeys("$.")
    End If

    ' create a table and write to the spreadsheet
    If (rowOffset = 0) Then
        WriteRowToRange s.Cells(1, 1), fields
        s.rows(1).AutoFilter
        s.rows(1).Font.Bold = True
    End If

    ' this is part of the original function, to paste to a worksheet
    If (j.count > 0) Then
        'Dim table As Variant
        table = JsonArrayToTable(j, fields)
        WriteTableToRange s.Cells(2 + rowOffset, 1), table
    End If
End Sub

Я создал это, чтобы добавить в свой код, но код просто пропускает эту часть, и никаких действий не происходит:

    ' This is my attempt to past it directly to an array
        Dim table As Variant
        table = JsonArrayToTable(j)
        For loopvar1 = 0 To UBound(table, 2)
            'For loopvar2 = 1 To UBound(table, 2)
                TEST.Cells(1, loopvar1 + 1) = table(0, loopvar1)
            'Next loopvar2
        Next loopvar1

OBS. Данные в JSON могут сильно различаться, поэтому идея заключалась в создании общей функции, которая могла бы передавать JSON в массив. В этом случае примером данных может быть (внутри моего кода это JSON извлекается для нескольких идентификаторов. Каждый раз, когда один извлекается, он вставляется в новую строку выходного листа):

{
"Response": {
        "dm": [
                {
                  "$": {  
                       "id": ""830778192",
                       "end_period": ""2023-10-25T00:00:00",
                       "end_period1": "2021-01-25T00:00:00",
                       }
                }
              ]
            }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...