2016-11-05 14 views
0

JSONがありますVBAで解析しようとしています。私は「オファー」の配列を正常に解析しました。 "オファー"の配列内には、別の配列 "価格" "USD"があります。VBAとJSONを使用したネストされた配列の解析

問題はすべての「オファー」オブジェクトに「米ドル」の配列があるわけではありません。私はテーブル/シートを作ることができるオブジェクトを作成しようとしていますが、オブジェクトをデバッグモードで印刷することさえできません。 Dict OfferDetailsに「USD」オブジェクトが含まれているわけではないため、この機能は動作しますが失敗します。

私がしたいのは、文字列を印刷することができ、「USD」オブジェクトが見つからない場合はスキップし、「USD」を持つものだけを印刷することです。 IsMissing(コード内)を試しましたが、欠落している "USD"オブジェクトにヒットしたときに失敗します。

「USD」の値を使ってこの文字列をどのように取得できますか? 「USD」は配列であり、いくつかのオブジェクトが含まれていますが、どちらに対処するかわかりません。理想的には、私が "オファー"を行ったのと同じ方法で "USD"を解析したいと思います。私はVBAがあまり良くないので、完全に失われています

これは、有効なWeb JSONを持つ作業スクリプトです。

あなたが辞書の Existsメソッドを使用したい
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

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

Works、ありがとうございます。今、すべてのUSDエントリを処理する方法を理解できれば、それらはすべて異なる値を持ちます。私はコードでそれぞれを参照できると思いますが、それらは変わります。 たとえば、オファー(0)または(1)vbaには4つのエントリがあり、(1)(2)vbaには8つあります。しかし、これは非常にうまく動作します、再度ありがとうございます – Wraymac

+0

上記アップデートを参照 –

+0

グッドティム、もう一度、完璧なソリューションをありがとう! – Wraymac

関連する問題