2016-04-23 8 views
0

VBA-JSON v2.0.1 in Excel-VBAParsing nicht konsistent json Antwortlänge in Excel VBA

Hier ist die JSON-Antwort, die ich von API-Abfrage erhalten

{ 
    "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" 
    } 
    ] 
} 

Hier ist ein Teil meines Codes um den Preis vom Element "Luftpost" zu analysieren.

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 

Der Code läuft gut, wenn das "Air Mail" -Element in (5) des "Versand" -Elements ist. Das Problem ist manchmal, dass es keine "UPS" - und "Air Mail" -Elemente gibt, also habe ich einen Fehler bekommen.

Wie man Code schreibt, um den "Luftpost" Preis zu analysieren, und wenn nicht existiert, vom "EMS" Preis analysieren (oder der preiswerteste Preis von allen)?

+0

Ich bin nicht vertraut mit der JsonConverter-Klasse, aber versuchen Sie sicher resultAirmailprice = Json ("Versand") ("Air Mail") ("Preis"). Ich sage dies beurteilt, wie die anderen Objekte erhalten werden ... – MacroMarc

+0

Funktioniert nicht. Als "Air Mail" ist der Wert von "Name" – user3394010

Antwort

0

Wenn Sie den Json-Parser-Code betrachten, gibt er ein Dictionary-Objekt zurück, das andere Dictionary-Objekte (Unterschlüssel) und für Arrays Collection-Objekte enthält. Im JSON sehe ich, dass "shipping" ein Array ist und der Parser ein Collection-Objekt zurückgibt.

So können Sie alle Collection-Mitglieder und -Methoden verwenden, um sie zu manipulieren und darauf zuzugreifen. Insbesondere können Sie mit Json("shipping").Count überprüfen, wie viele Elemente die Shipping-Kollektion enthält. Oder Sie können mit For each x in Json("shipping") über die Sammlung iterieren.

Um zu überprüfen, ob Sie ein Wörterbuch oder eine Sammlung haben, können Sie die TypeName-Funktion oder den TypeOf..Is-Operator verwenden.

+0

Funktioniert nicht. Ich habe "Laufzeitfehler, Index außerhalb des Bereichs", wenn es nur 4 Indizes von "Versand" gibt. – user3394010

+0

shippingmethods = Json ("Versand"). Count resultAirmailprice = Json ("Versand") (shippingmethods) ("Preis") Dies funktioniert. Vielen Dank. – user3394010