2016-04-23 9 views
0

解析エクセルVBAで非一貫性のJSONレスポンス長

ここで私はここでAPIクエリから

{ 
    "currency": { 
    "code": "USD", 
    "name": "US Dollar", 
    "prefix": "$", 
    "postfix": null 
    }, 
    "products": [ 
    { 
     "product_id": xxxxx, 
     "model_code": "xxxxx", 
     "quantity": 1, 
     "price": "45.60", 
     "total": "45.60", 
     "retail_price": "63.84" 
    } 
    ], 
    "shipping": [ 
    { 
     "name": "UPS", 
     "price": 43.83, 
     "delivery": "3 -10 Days delivery" 
    }, 
    { 
     "name": "DHL", 
     "price": 20.29, 
     "delivery": "2-6 days" 
    }, 
    { 
     "name": "FedEx", 
     "price": 31.46, 
     "delivery": "2-6 days" 
    }, 
    { 
     "name": "EMS", 
     "price": 25.74, 
     "delivery": "7 - 25 Days delivery" 
    }, 
    { 
     "name": "Air Mail", 
     "price": 11.85, 
     "delivery": "10 - 25 Days delivery" 
    } 
    ] 
} 

を取得するJSONレスポンスは、私のコードの一部です"Air Mail"要素から価格を解析する。

result = objHTTP.responseText 
Dim Json As Object 
Dim resultAirmailprice As String 
Set Json = JsonConverter.ParseJson(result) 
resultAirmailprice = Json("shipping")(5)("price") 
Cells(2, 2).Value = resultAirmailprice 

"Air Mail"要素が "shipping"要素の(5)にある場合、コードは正常に動作します。問題は「UPS」と「Air Mail」の要素がないことがあるため、エラーが発生します。 「航空便」の価格を解析し、存在しない場合は、「EMS」の価格(または全てのうち最も安い価格)から解析するコードを記述する方法

? JSONパーサコードを見

+0

私はJsonConverterクラスに慣れていないけど、確実にresultAirmailprice = JSON( "出荷")( "航空便")( "価格")をしてみてください。私は他のオブジェクトがどのように取得されたかを判断すると言っています... – MacroMarc

+0

動作しません。 "Air Mail"は "name"のVALUEなので – user3394010

答えて

0

、それが他の辞書オブジェクト(サブ鍵)と、配列のため、コレクションオブジェクトを含む辞書オブジェクトを返します。 Jsonでは、「出荷」が配列であることが分かり、パーサーはCollectionオブジェクトを返します。

だから、それを操作してアクセスするために、すべてのコレクションのメンバーとメソッドを使用することができます。特に、Json("shipping").Countを使用して、Shippingコレクションの要素数を確認できます。または、For each x in Json("shipping")でコレクションを繰り返し処理できます。

辞書またはコレクションがあるかどうかを確認するには、TypeName関数またはTypeOf..Is演算子を使用できます。

+0

動作しません。私は、 "出荷時"の下付き文字が4つしかない場合、 "実行時エラー、下付き文字を範囲外"にしました。 – user3394010

+0

shippingmethods = Json( "shipping")。 resultAirmailprice = Json( "shipping")(shippingmethods)( "price") これは機能します。ありがとう。 – user3394010

関連する問題