2016-11-05 3 views
0

У меня есть JSON Я пытаюсь разобрать в VBA. Я успешно проанализировал массив «предложений». Внутри массива «предложений» находится еще один массив «цены» «USD».Анализ массивов с использованием VBA и JSON

Проблема в том, что не каждый объект «предлагает» имеет массив «USD». Я пытаюсь создать объект, который я могу создать таблицу/лист, но я даже не могу получить объекты для печати в режиме отладки. Это работает, но терпит неудачу, потому что не каждый Dict OfferDetails содержит объект «USD».

Что бы я хотел сделать, так это возможность распечатать строку, и если объект «USD» отсутствует, просто пропустите его и напечатайте только те, у которых есть «USD». Я пробовал IsMissing (в коде), но он терпит неудачу, когда он попадает в отсутствующий объект «USD».

Любая идея, как я могу получить эту строку со значениями «USD»? Обратите внимание, что «USD» представляет собой массив и содержит несколько объектов, но я не знаю, как их решать. В идеале я хотел бы разобрать «доллар» так же, как и «предложения». Я полностью потерян, так как я не очень хорош в VBA

Это рабочий скрипт с действующим веб-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

Смежные вопросы