2016-11-05 39 views
0

我有一個JSON我想在VBA中解析。我已經成功解析了「offer」的數組。在「offer」陣列內部是另一個陣列「價格」「USD」。使用VBA和JSON解析嵌套數組

問題是並非每個「offer」對象都有「USD」數組。我試圖創建一個對象,我可以創建一個表格/工作表,但我甚至無法使用調試模式打印對象。這種方法有效,但因爲不是每個Dict OfferDetails都包含「USD」對象。

我想要做的是能夠打印字符串,如果「USD」對象丟失,只需跳過它並只打印具有「USD」的對象。我嘗試了IsMissing(在代碼中),但它在碰到缺少的「USD」對象時失敗。

任何想法如何我可以得到這個字符串與「USD」值?請注意,「USD」是一個數組幷包含多個對象,但我不知道如何解決它們。理想情況下,我想以「提供」的方式解析「美元」。我完全失去了,因爲我在VBA中不是很好

這是一個有效的Web JSON的工作腳本。

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 
+0

您可以向我們展示返回的實際JSON字符串嗎? –

+0

這是很長的,我沒有發佈在我的消息的原因。所以你可以在這裏得到它... http://wraymac.com/JSON/example1.json「http://wraymac.com/JSON/example1.json」 如果這不起作用,我可以發佈它 – Wraymac

+0

考慮到這裏和格式化您的JSON有點... http://jsonprettyprint.com/json-pretty-printer.php –

回答

3

您要使用的詞典的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確定每種類型對象中的項目數量。

+0

作品,謝謝。現在,如果我能弄清楚如何處理所有美元條目,它們都有不同的值。我想我可以參考代碼中的每一個,但他們改變。 例如報價(0)或(1)vba有四個條目和優惠(1)(2)vba有八個。但是這個工作非常好,再次謝謝 – Wraymac

+0

看到更新上面 –

+0

偉大的蒂姆,再次感謝,完美的解決方案! – Wraymac