VBA-JSON:将条目添加到现有文件

时间:2019-09-25 17:33:51

标签: json excel vba

我正在使用excel来通过VBA-JSON库修改现有的JSON,并且我正在有效地尝试执行javascript的.push操作,向嵌套数组添加了另一个条目。

这个先前发布的问题说明了我正在尝试做的事情,但是涉及创建JSON文件的范围。

VBA-JSON Create nested objects

已接受的答案虽然有帮助,但并没有告诉我如何在不完全重建的情况下添加到已有的内容中。我可以想象一个混乱的循环,将我现有的文件解析为字符串,然后执行与文章中类似的操作。我很好奇是否还有另一种方法。

'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 :(得分:1)

VBA Json实际上只是将json字符串转换成嵌套的词典和集合的廉价(有效)转换器/反转换器。因此,您不必“将[您的]文件解构成字典/集合并重建它” ,因为...已经存在了。这就是为什么必须添加Microsoft Scripting Runtime库才能使用它的原因。

您要处理的难题是将json对象中的每个对象都视为字典。相反,您想add(弹出)到entries集合。保持它们分开的一种好方法是,在VBA JSON中(据我所知),如果一个对象是键/值对,则它是一个Dictionary,如果它只是一个没有{{1 }},则为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对象。然后,我们可以将诸如EntriesDatea之类的键/值对添加到字典中。