VBA-JSON: добавить запись в существующий файл - PullRequest
0 голосов
/ 25 сентября 2019

Я использую Excel для изменения существующего JSON с помощью библиотеки VBA-JSON и эффективно пытаюсь сделать то, что делает .push из javascript, добавив еще одну запись во вложенный массив.

Это уже былоопубликованный вопрос, который иллюстрирует, что я пытаюсь сделать, но в рамках создания файла JSON.

VBA-JSON Создание вложенных объектов

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

'download json

Set json = JsonConverter.ParseJson(H.responseText)

Debug.print json(1)("entries")(1)("Date")
'2019-09-25

json(1)("entries")(2)("Date") = "2019-09-26"
'error 9 Subscript out of Range

'upload json

[
    {
        "Entries": [
            {
                "Date": 2019-09-25,
                "a": 1,
                "b": 2
            }
        ]
    }
]

Я могу получать доступ и изменять существующие записи, но не добавлять к ним.Я предполагаю, что это потому, что библиотека анализирует его как определенный массив, а не переменную?Есть идеи относительно простого решения, или мне придется деконструировать мой файл в словари / сборники и сначала перестроить его?

1 Ответ

0 голосов
/ 25 сентября 2019

VBA Json - это действительно дешевый (и эффективный) преобразователь / распаковщик строки json во вложенный набор словарей и сборников.Так что вам не нужно "деконструировать [ваш] файл в словари / сборники и перестраивать его" , поскольку ... он уже есть.Вот почему необходимо добавить библиотеку Microsoft Scripting Runtime, чтобы использовать ее.

Проблема, с которой вы сталкиваетесь, заключается в том, что вы рассматриваете каждый объект в вашем json объекте как словарь.Вместо этого вы хотите add (pop) в коллекцию entries.Хороший способ сохранить это отдельно - это то, что в VBA JSON (насколько я видел), если объект является парой ключ / значение, тогда это Dictionary, а если это просто объект без key, тогда этоCollection.Я уверен, что здесь есть больше нюансов, но он хорошо работает в этом сценарии.

Учтите:

Sub test()
    Dim Json As Object
    Set Json = JsonConverter.ParseJson("[{""Entries"":[{""Date"": 2019-09-25,""a"": 1,""b"": 2}]}]")

    Dim entry1 As Object
    Set entry1 = Json(1)("Entries")

    Stop '<--inspect Locals and see that we have a Collection here

    'Add to the collection (different then adding to a dictionary)
    'We will add a dictionary to the collection though
    Json(1)("Entries").Add New Dictionary

    'Now add to the dictionary.
    Json(1)("Entries")(2).Add "Date", "2019-09-26"

    Stop

    Debug.Print JsonConverter.ConvertToJson(Json)

    'Alternatively you could create the dictionary and add your keys, then `pop` your entries
    Dim Entry As Dictionary
    Set Entry = New Dictionary
    Entry.Add "Date", "2019-09-26"
    Entry.Add "a", "2"
    Entry.Add "b", "3"

    Json(1)("Entries").Add Entry

    Debug.Print JsonConverter.ConvertToJson(Json)
End Sub

Это должно выплевывать то, что вы ищете (я думаю):

[{"Entries":[{"Date":"2019-09-25","a":1,"b":2},{"Date":"2019-09-26"}]}]

Думаю, еще один способ обдумать это - если мы хотим добавить новый массив в наш Entries, то мы должны добавить новый объект Dictionary в коллекцию Entries.Затем мы можем добавить в словарь наши пары ключ / значение, такие как Date, a и b.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...