2017-12-29 29 views
2

Ich versuche eine App zu erstellen, mit der ich Live-Währungswerte online abrufen kann. Ich habe apilayer verwendet und ich habe die gewünschten Daten mit Ausnahme des endgültigen Währungswerts erfolgreich abgerufen. Ich bin mir nicht sicher, wie ich den Wert im Knoten "Anführungszeichen" lesen soll.Wie kann man den Wert von "Quotes" in diesem JSON-Format abrufen?

Jason Ergebnis aus API:

{ 
    "success":true, 
    "terms":"https:\/\/currencylayer.com\/terms", 
    "privacy":"https:\/\/currencylayer.com\/privacy", 
    "timestamp":1514567346, 
    "source":"USD", 
    "quotes":{ 
    "USDPHP":49.950001 
    } 
} 

Mit dieser:

Dim req As HttpWebRequest 
    Dim res As HttpWebResponse = Nothing 
    Dim rdr As StreamReader 

    req = DirectCast(WebRequest.Create("http://apilayer.net/api/live?access_key=xxKeyRemovedxx&currencies=PHP&format=1"), HttpWebRequest)` 
    res = DirectCast(req.GetResponse, HttpWebResponse) 
    rdr = New StreamReader(res.GetResponseStream) 

    Dim jsonresp As String = rdr.ReadToEnd 

    Dim jResuldict = JsonConvert.DeserializeObject(Of Dictionary(Of String, `Object))(jsonresp)` 
    Dim qts = jResuldict.Item("quotes").ToString 

    MsgBox(qts) 

Ergebnis ist:

{ 
    "USDPHP":49.950001 
    } 

Ich wollte nur den Wert innerhalb USDPHP abzurufen, die 49.95 ist. Damit kann ich diesen Wert für die Konvertierung verwenden.

Was fehlt mir?

+0

Wenn Sie nur eine Sache benötigen, analysieren Sie sie, anstatt zu versuchen, sie zu deserialisieren. – Plutonix

Antwort

1

Es funktioniert sieht aus wie quotes eine verschachtelte Wörterbuch von Name/Dezimal-Paare ist. Um es zu extrahieren, können Sie Ihre JSON-Zeichenfolge in eine JToken-Hierarchie analysieren, die "quotes"-Eigenschaft mit SelectTokens() auswählen und dann ihren Wert mit JToken.ToObject(of Dictionary(of String, Decimal))() deserialisieren. Nachdem dies erledigt, so können Sie mit arbeiten, wie Sie es mit jedem Wörterbuch, zum Beispiel, indem sie mit For Each durch seinen Schlüssel/Wert-Paare Looping:

' Extract and deserialize quotes dictionary 
Dim quotes as Dictionary(of String, Decimal) = JToken.Parse(jsonresp) _ 
    .SelectTokens("quotes") _ 
    .Select(Function(d) d.ToObject(of Dictionary(of String, Decimal))()) _ 
    .SingleOrDefault() 

' Show quotes to the user 
Console.WriteLine(If(quotes.Count = 1, "There is 1 quote: ", string.Format("There are {0} quotes", quotes.Count))) 
For Each pair in quotes 
    Dim name as String = pair.Key 
    Dim quote as Decimal = pair.Value 

    Console.WriteLine(" Quote for {0} is {1}.", name, quote) 
Next 

Welche

There is 1 quote: 
    Quote for USDPHP is 49.950001. 

gibt Wenn Sie sicher sind, dass ein und nur ein "quotes" Token vorhanden sein wird, können Sie vereinfachen, dass ein bisschen von SelectToken() mit eher als SelectTokens():

' Extract and deserialize quotes dictionary 
Dim quotes as Dictionary(of String, Decimal) = JToken.Parse(jsonresp) _ 
    .SelectToken("quotes") _ 
    .ToObject(of Dictionary(of String, Decimal))() 

Schließlich, wenn Sie den Namen USDPHP im Voraus weiß zufällig, können Sie seinen spezifischen Wert mit SelectToken() dann mit einem explicit cast-Decimal werfen auszusuchen:

Dim quote as Decimal = CType(JToken.Parse(jsonresp).SelectToken("quotes.USDPHP"), Decimal) 

Probe arbeiten .Net fiddle.

+0

Danke, es scheint, ich habe so viel zu lernen. Eigentlich ist dies mein erster Tag, an dem ich das JSON-Parsing gelernt habe. –

+0

@HardcoreHenry - froh zu helfen. Ich habe eine dritte Option hinzugefügt, falls Sie den Namen "USDPHP" im Voraus kennen. – dbc

0

dies versuchen, ich habe es nicht getestet, aber es sollte

Dim qts = jResuldict.Item("quotes.USDPHP").ToString 
MsgBox(qts) 
+0

Fehler: Der angegebene Schlüssel war im Wörterbuch nicht vorhanden. Scheint, dass der Gegenstand, den ich zu finden versuche, nicht existiert. –

Verwandte Themen