Arrays 使用VBA和JSON解析嵌套数组
我试图用VBA解析一个JSON。我已经成功地解析出了“offers”数组。在“offers”数组中是另一个数组“prices”“USD” 问题是不是每个“offers”对象都有“USD”数组。我正在尝试创建一个可以用来制作表格/工作表的对象,但我甚至无法在调试模式下打印这些对象。这是可行的,但是失败了,因为不是每个Dict OfferDetails都包含“USD”对象 我想做的是能够打印字符串,如果“USD”对象丢失,只需跳过它,只打印有“USD”的对象。我尝试了IsMissing(在代码中),但当它命中丢失的“USD”对象时失败 知道我如何得到这个带“USD”值的字符串吗?请注意,“USD”是一个数组,包含多个对象,但我也不知道如何处理它们。理想情况下,我会像解析“报价”一样解析“美元”。我完全迷路了,因为我的VBA不是很好 这是一个带有有效web JSON的工作脚本Arrays 使用VBA和JSON解析嵌套数组,arrays,json,excel,vba,ms-access,Arrays,Json,Excel,Vba,Ms Access,我试图用VBA解析一个JSON。我已经成功地解析出了“offers”数组。在“offers”数组中是另一个数组“prices”“USD” 问题是不是每个“offers”对象都有“USD”数组。我正在尝试创建一个可以用来制作表格/工作表的对象,但我甚至无法在调试模式下打印这些对象。这是可行的,但是失败了,因为不是每个Dict OfferDetails都包含“USD”对象 我想做的是能够打印字符串,如果“USD”对象丢失,只需跳过它,只打印有“USD”的对象。我尝试了IsMissing(在代码中),
Sub getJSONEP_lib_working()
'Need the JsonConverter found here https://github.com/VBA-tools/VBA-JSON
'Need the Microsoft Scripting Runtime
Dim Parsed As Dictionary
Dim Item As Dictionary
Dim OfferDetails As Dictionary
Dim Price As Dictionary
Dim USD As Dictionary
URL = "http://wraymac.com/JSON/example1.json"
url2 = "[{" & """mpn""" & ":" & """41202""" & "}]"
Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
MyRequest.Open "GET", URL
MyRequest.Send
JsonString = MyRequest.ResponseText
Dim json As Object
Set json = JsonConverter.ParseJson(JsonString)
Set Parsed = JsonConverter.ParseJson(MyRequest.ResponseText)
For Each Item In Parsed("results")(1)("items")
For Each OfferDetails In Item("offers")
'I tried this it doesn't work, it fails when it finds a non existent "USD"
If Not IsMissing(OfferDetails("prices")("USD")(1)(1)) Then
Debug.Print OfferDetails("prices")("USD")(1)(1)
Else
Debug.Print "Missing"
End If
x = Item("mpn") & " " & "sku" & " - " & OfferDetails("sku") & "," & "UID" & " - " & OfferDetails("seller")("uid") & " " & OfferDetails("moq") & "packaging" & " = " & OfferDetails("packaging") & " " & OfferDetails("seller")("name") & " " & Item("manufacturer")("name")
Debug.Print x
'This works but fails because not every Dict OfferDetails contains the "USD" object
'x = Item("mpn") & " " & "sku" & " - " & OfferDetails("sku") & "," & "UID" & " - " & OfferDetails("seller")("uid") & " " & OfferDetails("moq") & "packaging" & " = " & OfferDetails("packaging") & " " & OfferDetails("seller")("name") & " " & Item("manufacturer")("name")& " "&OfferDetails("prices")("USD")(1)(1)
Next OfferDetails
Next
End Sub
您想使用字典的
Exists
方法:
Set Parsed = JsonConverter.ParseJson(MyRequest.ResponseText)
For Each Item In Parsed("results")(1)("items")
For Each OfferDetails In Item("offers")
If OfferDetails("prices").Exists("USD") Then
Debug.Print OfferDetails("prices")("USD").Count & " items:"
Debug.Print "-----------------"
For Each x In OfferDetails("prices")("USD")
Debug.Print x(1), x(2)
Next x
Debug.Print "-----------------"
Else
Debug.Print "No USD"
End If
Next OfferDetails
Next
转换器将对象({})解析为字典,将数组([])解析为集合,因此您可以使用
Count
确定每种类型对象中的项数。是否要使用字典的Exists
方法:
Set Parsed = JsonConverter.ParseJson(MyRequest.ResponseText)
For Each Item In Parsed("results")(1)("items")
For Each OfferDetails In Item("offers")
If OfferDetails("prices").Exists("USD") Then
Debug.Print OfferDetails("prices")("USD").Count & " items:"
Debug.Print "-----------------"
For Each x In OfferDetails("prices")("USD")
Debug.Print x(1), x(2)
Next x
Debug.Print "-----------------"
Else
Debug.Print "No USD"
End If
Next OfferDetails
Next
转换器将对象({})解析为字典,将数组([])解析为集合,因此您可以使用
Count
来确定每种类型对象中的项数。您能告诉我们返回的实际JSON字符串吗?它很长,这是我没有在邮件中发布的原因。所以你可以在这里得到它。。。“如果这不起作用,我可以把它贴在这里,考虑把你的JSON格式化一点。。。我使用,只是剪切和粘贴,显示所有内容、类型和索引,你能告诉我们返回的实际JSON字符串吗?它很长,这就是我没有在我的消息中发布的原因。所以你可以在这里得到它。。。“如果这不起作用,我可以把它贴在这里,考虑把你的JSON格式化一点。。。我使用,只是剪切和粘贴,显示一切,类型和索引,作品,谢谢。现在如果我能弄清楚如何处理所有美元条目,它们都有不同的值。我想我可以在代码中引用每一个,但它们会改变。例如,报价(0)或(1)vba有四个条目,报价(1)(2)vba有八个条目。但这很有效,再次谢谢你,谢谢。现在如果我能弄清楚如何处理所有美元条目,它们都有不同的值。我想我可以在代码中引用每一个,但它们会改变。例如,报价(0)或(1)vba有四个条目,报价(1)(2)vba有八个条目。但这很有效,再次谢谢你