从此特定JSON获取值

时间:2017-02-28 17:46:30

标签: c# .net json

我正试图从这个JSON中获取所有“最后”值:

{"btc":{
  "usd": {
    "bitfinex": {
      "last": "1191.60",
      "volume": "1.99324e+7"
    },
    "bitstamp": {
      "last": "1193.06",
      "volume": "8.73693e+6"
    },
    "btce": {
      "last": "1174.27",
      "volume": "6.03521e+6"
    }
  }
}

但由于某种原因,我只能访问“btc”和“usd”。我无法从中获得任何东西,包括“最后”的价值观。这是我正在使用的代码:

 private string GetPrice()
    {
        WebClient wc = new WebClient();
        var data = wc.DownloadString("http://preev.com/pulse/units:btc+usd/sources:bitfinex+bitstamp+btce");
        JObject o = JObject.Parse(data);
        string response = o["btc"].ToString();
        return response;
    }

如果我将其更改为:

o["last"].ToString();

它只是没有返回任何东西。有人可以请我提供解决方案吗?我也尝试从中创建一个键/值字典并循环遍历每一对。没用。

4 个答案:

答案 0 :(得分:1)

JObject结构类似于具有属性的类,因此第一级索引器[" btc"]返回另一个必须查询其自身属性的对象[" usd&#34 ]

您也可以选择使用JObject.SelectToken,这通常不是一个坏主意。其他答案已经展示了如何链接索引器,但这很难阅读和维护。相反,你可以这样做:

jObj.SelectToken("btc[0].usd[0].bitstamp[0].last").ToString();

此外,您可以将此语法的强大功能用于其他查询:

// a list o all the 'last' values
jObj.SelectTokens("btc.usd.*.last").Select(t=>t.ToString()).ToList(); 

如果您要构建一个更复杂的系统,另一个优点是您可以将查询放在配置文件或属性等中,以使它们更易于管理或部署逻辑更改而无需重建。

另一种方法是构建自己的类结构并将json反序列化为它,因此您有强类型值(例如,值为double而不是字符串)

public class btc {
  public usd usd {get;set;}
}
public class usd....

var btcLoaded = JsonConvert.DeserializeObject<btc>(jsonString);
var lastBitstamp = btc.usd.bitstamp.last;

答案 1 :(得分:0)

使用:void Foo(params int[] numbers) { Foo((IEnumerable<int>)numbers); } void Foo(IEnumerable<int> numbers) { //Do the real thing here } 获取最后一次&#39; &bitffinex&#39;。

的价值

答案 2 :(得分:0)

每当您索引o变量时,在解析JSON之后,您将从JSON的根目录索引。为了访问像'last'这样的嵌套属性,你需要索引到JSON的下一级:

var bitfinex = o["btc"]["usd"]["bitfinex"]["last"].ToString();
var bitstamp = o["btc"]["usd"]["bitstamp"]["last"].ToString();
var btce = o["btc"]["usd"]["btce"]["last"].ToString();

要减少重复次数,您可以迭代btc.usd字段下的属性。

答案 3 :(得分:0)

如果你想要所有的最后一个值使用这个..

decimal[] lastValues = obj.SelectTokens("$..last").ToArray()
.Select(a => a.Parent.ToObject<decimal>()).ToArray();

如果你想要字典,请使用它..

var dictionary = obj["btc"]["usd"].Select(a =>
        new
        {
            Key = ((JProperty)a).Name,
            Value = a.First["last"].ToObject<decimal>()
        })
        .ToDictionary(a => a.Key, a => a.Value);