如何以这种json格式检索“引号”的值?

时间:2017-12-29 18:02:53

标签: json vb.net json.net

我正在尝试构建一个可以在线检索实时货币值的应用程序。 我正在使用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&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)

结果是:

    {
    "USDPHP":49.950001
  }

我只想检索USDPHP里面的值49.95。 这样我就可以使用该值进行转换。

我错过了什么?

2 个答案:

答案 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)