我正在尝试构建一个可以在线检索实时货币值的应用程序。
我正在使用apilayer
并且我成功检索了我想要的数据,但最终货币值除外。
我不确定如何读取“引号”节点中的值。
API的Jason结果:
{
"success":true,
"terms":"https:\/\/currencylayer.com\/terms",
"privacy":"https:\/\/currencylayer.com\/privacy",
"timestamp":1514567346,
"source":"USD",
"quotes":{
"USDPHP":49.950001
}
}
使用此:
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¤cies=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)
结果是:
{
"USDPHP":49.950001
}
我只想检索USDPHP
里面的值49.95。
这样我就可以使用该值进行转换。
我错过了什么?
答案 0 :(得分:1)
看起来quotes
是名称/小数对的嵌套字典。要提取它,您可以将JSON字符串解析为JToken
层次结构,使用SelectTokens()
选择"quotes"
属性,然后使用JToken.ToObject(of Dictionary(of String, Decimal))()
反序列化其值。完成后,您可以像使用任何字典一样使用,例如通过使用For Each
循环键入/值对:
' 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
哪个输出
There is 1 quote: Quote for USDPHP is 49.950001.
如果您确定只有一个"quotes"
令牌,则可以使用SelectToken()
而不是SelectTokens()
来简化这一点:
' Extract and deserialize quotes dictionary
Dim quotes as Dictionary(of String, Decimal) = JToken.Parse(jsonresp) _
.SelectToken("quotes") _
.ToObject(of Dictionary(of String, Decimal))()
最后,如果您事先知道名称USDPHP
,可以使用SelectToken()
选择其特定值,然后使用explicit cast将其投放到Decimal
:< / p>
Dim quote as Decimal = CType(JToken.Parse(jsonresp).SelectToken("quotes.USDPHP"), Decimal)
示例工作.Net fiddle。
答案 1 :(得分:0)
试试这个,我没有测试过,但它应该可以正常工作
Dim qts = jResuldict.Item("quotes.USDPHP").ToString
MsgBox(qts)