2017-06-23 4 views
0

私は辞書を初めて使いました。私は外部サイトからデータを引き出して、イニシアチブレベルのデータを含むJSON文字列を出力します.VBA-JSONコードを使用して解析するとhereが見つかりました。このJSONパーサーは、ネストされた辞書やコレクションを含むJSONディクショナリオブジェクトを出力します。このイニシアティブの3つの項目があるので2つ以上のネストされた辞書を1にマージし、カスタムオーダーでアイテムをアレンジする

{ 
    "respCode": 200, 
    "respMessage": "OK", 
    "response": [ 
    { 
     "INIT_ID": 1234567, 
     "INIT_NAME": "SOME INIT NAME", 
     "CATE": "PERFUMED WATER", 
     "CTRY": "GB", 
     "OPEN_DATE": "2016-02-10 00:00:00", 
     "ITEMS": [ 
     { 
      "ITEM_ID": "44556677", 
      "ITEM_DSCR": "ABC CO, PERFUMED WATER,CARBONATED,AMBIENT,,,,CAFFEINE,PLASTIC,PACK,250ML" 
     }, 
     { 
      "ITEM_ID": "45566778", 
      "ITEM_DSCR": "ABC CO, PERFUMED WATER,CARBONATED,CRYSTAL,,,,CAFFEINE,GLASS,PACK,270ML" 
     }, 
     { 
      "ITEM_ID": "46576879", 
      "ITEM_DSCR": "ABC CO, PERFUMED WATER,NON-CARBONATED,AMBIENT,,,,NON-CAFFEINE,TETRA,PACK,275ML" 
     } 
     ] 
    } 
    ] 
} 

、私は別の3 API呼び出しを使用して外部のウェブサイトから、再びこれら3つの項目の属性データをプルする必要があります - 応答が再びJSON文字列で、私が持っていることこのように、ネストされた辞書やコレクションを含むDictionaryオブジェクトを取得するVBA-JSONを使用して解析:

ITEMを1:

{ 
    "respCode": 200, 
    "respMessage": "OK", 
    "response": [ 
    { 
     "ITEM CODE": "44556677", 
     "ITEM DESCRIPTION": "ABC CO, PERFUMED WATER,CARBONATED,AMBIENT,,,,CAFFEINE,PLASTIC,PACK,250ML", 
     "ATTR DETAILS": [ 
     { 
      "ATTR ID": "25", 
      "ATTR DESCRIPTION": "MOD_NAME", 
      "ATTR_VAL ID": "22222222", 
      "ATTR_VAL DESCRIPTION": "PERFUMED WATER - CARBONATED - CAFFIENE" 
     }, 
     { 
      "ATTR ID": "45", 
      "ATTR DESCRIPTION": "PROM ACTIVE", 
      "ATTR_VAL ID": "44444444", 
      "ATTR_VAL DESCRIPTION": "NO PROMO" 
     }, 
     { 
      "ATTR ID": "38", 
      "ATTR DESCRIPTION": "BRAND", 
      "ATTR_VAL ID": "99999999", 
      "ATTR_VAL DESCRIPTION": "KANE & ABEL" 
     }, 
     { 
      "ATTR ID": "51", 
      "ATTR DESCRIPTION": "WEIGHT/VOLUME", 
      "ATTR_VAL ID": "66666666", 
      "ATTR_VAL DESCRIPTION": "250ML" 
     } 
     ] 
    } 
    ] 
} 

ITEM 2:

{ 
    "respCode": 200, 
    "respMessage": "OK", 
    "response": [ 
    { 
     "ITEM CODE": "45566778", 
     "ITEM DESCRIPTION": "ABC CO, PERFUMED WATER,CARBONATED,CRYSTAL,,,,CAFFEINE,GLASS,PACK,270ML", 
     "ATTR DETAILS": [ 
     { 
      "ATTR ID": "25", 
      "ATTR DESCRIPTION": "MOD_NAME", 
      "ATTR_VAL ID": "22222222", 
      "ATTR_VAL DESCRIPTION": "PERFUMED WATER, CRYSTAL - CARBONATED - CAFFIENE" 
     }, 
     { 
      "ATTR ID": "45", 
      "ATTR DESCRIPTION": "PROM ACTIVE", 
      "ATTR_VAL ID": "44444444", 
      "ATTR_VAL DESCRIPTION": "PROMO" 
     }, 
     { 
      "ATTR ID": "38", 
      "ATTR DESCRIPTION": "BRAND", 
      "ATTR_VAL ID": "99999999", 
      "ATTR_VAL DESCRIPTION": "BEAUTY & BEAST" 
     }, 
     { 
      "ATTR ID": "51", 
      "ATTR DESCRIPTION": "WEIGHT/VOLUME", 
      "ATTR_VAL ID": "66666666", 
      "ATTR_VAL DESCRIPTION": "270ML" 
     } 
     ] 
    } 
    ] 
} 

ITEM 3:私は何をしたいです

{ 
    "respCode": 200, 
    "respMessage": "OK", 
    "response": [ 
    { 
     "ITEM CODE": "46576879", 
     "ITEM DESCRIPTION": "ABC CO, PERFUMED WATER,NON-CARBONATED,AMBIENT,,,,NON-CAFFEINE,TETRA,PACK,275ML", 
     "ATTR DETAILS": [ 
     { 
      "ATTR ID": "25", 
      "ATTR DESCRIPTION": "MOD_NAME", 
      "ATTR_VAL ID": "22222222", 
      "ATTR_VAL DESCRIPTION": "PERFUMED WATER - NON-CARBONATED - NON-CAFFIENE" 
     }, 
     { 
      "ATTR ID": "45", 
      "ATTR DESCRIPTION": "PROM ACTIVE", 
      "ATTR_VAL ID": "44444444", 
      "ATTR_VAL DESCRIPTION": "NO PROMO" 
     }, 
     { 
      "ATTR ID": "38", 
      "ATTR DESCRIPTION": "BRAND", 
      "ATTR_VAL ID": "99999999", 
      "ATTR_VAL DESCRIPTION": "HENSEL & GRETEL" 
     }, 
     { 
      "ATTR ID": "51", 
      "ATTR DESCRIPTION": "WEIGHT/VOLUME", 
      "ATTR_VAL ID": "66666666", 
      "ATTR_VAL DESCRIPTION": "275ML" 
     } 
     ] 
    } 
    ] 
} 

:各項目のようなそのアイテムIDで指定された各アイテムのマージされます属性ような第一イニシアティブ辞書との3つの項目の辞書をマージこの:

決勝辞書:

{ 
    "respCode": 200, 
    "respMessage": "OK", 
    "response": [ 
    { 
     "INIT_ID": 1234567, 
     "INIT_NAME": "SOME INIT NAME", 
     "CATE": "PERFUMED WATER", 
     "CTRY": "GB", 
     "OPEN_DATE": "2016-02-10 00:00:00", 
     "ITEMS": [ 
     { 
      "ITEM_ID": "44556677", 
      "ITEM_DSCR": "ABC CO, PERFUMED WATER,CARBONATED,AMBIENT,,,,CAFFEINE,PLASTIC,PACK,250ML" 
      "ATTR DETAILS": [ 
       { 
       "ATTR ID": "25", 
       "ATTR DESCRIPTION": "MOD_NAME", 
       "ATTR_VAL ID": "22222222", 
       "ATTR_VAL DESCRIPTION": "PERFUMED WATER - CARBONATED - CAFFIENE" 
      }, 
      { 
       "ATTR ID": "45", 
       "ATTR DESCRIPTION": "PROM ACTIVE", 
       "ATTR_VAL ID": "44444444", 
       "ATTR_VAL DESCRIPTION": "NO PROMO" 
      }, 
      { 
       "ATTR ID": "38", 
       "ATTR DESCRIPTION": "BRAND", 
       "ATTR_VAL ID": "99999999", 
       "ATTR_VAL DESCRIPTION": "KANE & ABEL" 
      }, 
      { 
       "ATTR ID": "51", 
       "ATTR DESCRIPTION": "WEIGHT/VOLUME", 
       "ATTR_VAL ID": "66666666", 
       "ATTR_VAL DESCRIPTION": "250ML" 
      } 
      ] 
     }, 

     { 
      "ITEM_ID": "45566778", 
      "ITEM_DSCR": "ABC CO, PERFUMED WATER,CARBONATED,CRYSTAL,,,,CAFFEINE,GLASS,PACK,270ML" 
      "ATTR DETAILS": [ 
      { 
       "ATTR ID": "25", 
       "ATTR DESCRIPTION": "MOD_NAME", 
       "ATTR_VAL ID": "22222222", 
       "ATTR_VAL DESCRIPTION": "PERFUMED WATER, CRYSTAL - CARBONATED - CAFFIENE" 
      }, 
      { 
       "ATTR ID": "45", 
       "ATTR DESCRIPTION": "PROM ACTIVE", 
       "ATTR_VAL ID": "44444444", 
       "ATTR_VAL DESCRIPTION": "PROMO" 
      }, 
      { 
       "ATTR ID": "38", 
       "ATTR DESCRIPTION": "BRAND", 
       "ATTR_VAL ID": "99999999", 
       "ATTR_VAL DESCRIPTION": "BEAUTY & BEAST" 
      }, 
      { 
       "ATTR ID": "51", 
       "ATTR DESCRIPTION": "WEIGHT/VOLUME", 
       "ATTR_VAL ID": "66666666", 
       "ATTR_VAL DESCRIPTION": "270ML" 
      } 
      ] 
     }, 

     { 
      "ITEM_ID": "46576879", 
      "ITEM_DSCR": "ABC CO, PERFUMED WATER,NON-CARBONATED,AMBIENT,,,,NON-CAFFEINE,TETRA,PACK,275ML" 
      "ATTR DETAILS": [ 
      { 
       "ATTR ID": "25", 
       "ATTR DESCRIPTION": "MOD_NAME", 
       "ATTR_VAL ID": "22222222", 
       "ATTR_VAL DESCRIPTION": "PERFUMED WATER - NON-CARBONATED - NON-CAFFIENE" 
      }, 
      { 
       "ATTR ID": "45", 
       "ATTR DESCRIPTION": "PROM ACTIVE", 
       "ATTR_VAL ID": "44444444", 
       "ATTR_VAL DESCRIPTION": "NO PROMO" 
      }, 
      { 
       "ATTR ID": "38", 
       "ATTR DESCRIPTION": "BRAND", 
       "ATTR_VAL ID": "99999999", 
       "ATTR_VAL DESCRIPTION": "HENSEL & GRETEL" 
      }, 
      { 
       "ATTR ID": "51", 
       "ATTR DESCRIPTION": "WEIGHT/VOLUME", 
       "ATTR_VAL ID": "66666666", 
       "ATTR_VAL DESCRIPTION": "275ML" 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

は、最終的に私は最終的な辞書をループにしたいと、このようなワークシートの3列の3つの項目の詳細を表示:

enter image description here

誰かがこれを行う方法で私を導くことはできますか?

EDIT:

Sub GetJSON() 
Dim XMLhttp As Object, oJSON As Object, oRTN As Object 
Dim URL1$ 
Dim arrItemIDs() As Variant 


Set oRTN = CreateObject("Scripting.Dictionary") 
oRTN.comparemode = vbTextCompare 

On Error GoTo ErrorHandler 
With ThisWorkbook 
    Set wsMain = .Sheets("Main") 
    Set wsOut = .Sheets("Output") 

    URL = "http://11.27.141.15:8000/dev/getInit?" _ 
     & "email=" & "[email protected]" & "&country=" & "GB" & "&initid=" & "1234567" 

    Set XMLhttp = CreateObject("MSXML2.ServerXMLHTTP") 
    With XMLhttp 
     .Open "GET", URL, False 
     .setRequestHeader "Content-Type", "application/json" 
     .setRequestHeader "Accept", "application/json" 
     .Send 

     If XMLhttp.ReadyState = 4 And XMLhttp.Status = 200 Then 
      Set oJSON = ParseJson(XMLhttp.ResponseText) 

      ' ******CODE TO BE WRITTEN TO COLLECT THE ITEM IDs IN AN ARRAY***** 
      arrItemIDs = RecurseDictionary(oJSON) 


      ' ***************************** 
      For x = LBound(arrItemIDs) To UBound(arrItemIDs) 
       URL = "http://11.27.141.15:8000/dev/getItemAttr?" _ 
       & "email=" & "[email protected]" & "&country=" & "GB" & "&itemid=" & arrItemIDs(x) 
       Set XMLhttp = CreateObject("MSXML2.ServerXMLHTTP") 
       With XMLhttp 
        .Open "GET", URL, False 
        .setRequestHeader "Content-Type", "application/json" 
        .setRequestHeader "Accept", "application/json" 
        .Send 

        If XMLhttp.ReadyState = 4 And XMLhttp.Status = 200 Then 
           Set oJSON = ParseJson(XMLhttp.ResponseText) 
         ' ******CODE TO BE WRITTEN TO MERGE EACH ITEMS ATTRIBUTES JSON TO EARLIER INITIATIVES JSON ***** 


         ' ***************************** 
        End If 
       End With 
      Next x 

      ' ******CODE TO BE WRITTEN TO DUMP MERGED ARRAY OR DIC ON TO SHEET***** 
      i = 1 
      wsOut.Cells.ClearContents 


      ' ***************************** 

     End If 
    End With 
End With 
+0

あなたはこれまで何を持っていますか?具体的にどこに問題がありますか?辞書をマージするか、出力シートを作成するだけですか? –

+0

@TimWilliams以前はjsonオブジェクトや辞書で作業していなかったので、どのように出力を作成できるかわかりません。イニシアチブには複数の項目があるので、複数のAPI呼び出しによってjsonをダウンロードします。したがって、私は最終的なjsonは合併されたものでなければならないと考えました。 – sifar786

+0

既にマージされたバージョンをワークシートにレンダリングするコードがない限り、余分な作業のように思えます。必要に応じて各アイテムをフェッチするだけです。あなたがしたいことはそれほど単純ではありませんが、コードで始める場合を除いて、ここにいる人々はジャンプしてあなたのために書くことはありません。 –

答えて

1

これは、あなたが始められるかもしれない....ここでは私が把握できるものである.....が、ブランクが満たされる必要があります:

Sub Tester() 

    Dim Json As Object, itm As Object, itemDetails, k, s As String 
    Dim initiatives, initiative, items, itmId, details 

    'I'm storing the JSON on a worksheet for testing purposes... 
    Set Json = JsonConverter.ParseJson(Sheet1.Range("A1").Value) 

    Set initiatives = Json("response") '<< array of inititatives 

    For Each initiative In initiatives 

     'Top-level info.... 
     Debug.Print initiative("INIT_ID") 
     Debug.Print initiative("INIT_NAME") 
     Debug.Print initiative("CATE") 
     'etc.... 

     'list info on ITEMS (as a a collection) 
     Set items = initiative("ITEMS") 

     For Each itm In items 
      'itm is a Dictionary 
      itmId = itm("ITEM_ID") 
      Debug.Print "Item: " & itmId 
      'here's where you'd fetch the details using item id... 
      Set itemDetails = JsonConverter.ParseJson(Sheet1.Range("B1").Value)("response")(1) 
      Set details = itemDetails("ATTR DETAILS") 
      Debug.Print details.Count 

     Next itm 

    Next 

End Sub 

私は希望リクエスト/レスポンス/解析をスタンドアロン関数に分解します。

'return a parsed JSON object given a URL 
Function GetJsonObject(URL As String) 
    Dim XMLhttp As Object, oJSON As Object 
    Set XMLhttp = CreateObject("MSXML2.ServerXMLHTTP") 
    With XMLhttp 
     .Open "GET", URL, False 
     .setRequestHeader "Content-Type", "application/json" 
     .setRequestHeader "Accept", "application/json" 
     .Send 
     If .ReadyState = 4 And .Status = 200 Then 
      Set oJSON = ParseJson(.ResponseText) 
     End If 
    End With 
    Set GetJsonObject = oJSON 
End Function 
+0

複数のアイテムを持つことができるイニシアチブは1つだけです。また、シート写真を見ると、ATTR_DESCRIPTIONがキーになり、ATTR_VAL_DESCRIPTIONが値になります。 – sifar786

+0

最初のjsonは配列として "response"を持っています。その配列に要素が1つしかない場合は、コードを単純化します。それはあなたを始めさせるはずです。 –

+0

ParseJson関数は、ネストされた辞書とコレクション(配列ではない)を含むディクショナリを返すことが分かりました。したがって、キーとディクショナリを取得するために、Keyがディクショナリまたはコレクションであるかどうかを確認するために、ルーピングするには再帰的な関数が必要です。どのようにしてそのような関数を書くことができますか? – sifar786

関連する問題