我正在使用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
}
]
}
]
我可以访问和修改现有条目,但不能添加到其中。我猜这是因为库将其解析为已定义的数组而不是变量?关于简单解决方案的任何想法,还是我必须将文件解构成字典/集合并首先重建它?
答案 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
对象。然后,我们可以将诸如Entries
,Date
和a
之类的键/值对添加到字典中。