我正试图从这个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();
它只是没有返回任何东西。有人可以请我提供解决方案吗?我也尝试从中创建一个键/值字典并循环遍历每一对。没用。
答案 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);