我目前正在为自己创建自己的加密货币跟踪器,这有点好玩,但我有点卡住了。我正在使用的服务是:
https://min-api.cryptocompare.com/data/pricemulti?fsyms=
我拥有3个使用某些代码从api中提取数据的加密货币,这是一个示例请求:
https://min-api.cryptocompare.com/data/pricemulti?fsyms=ETH,LKK,BTC&tsyms=ETH,LKK,BTC
会返回:
{
"ETH": {
"BTC": 0.04948,
"LKK": 876.08,
"ETH": 1
},
"LKK": {
"BTC": 0.00005356,
"LKK": 1,
"ETH": 0.001141
},
"BTC": {
"BTC": 1,
"LKK": 18671.99,
"ETH": 20.21
}
}
使用newtonsoft.json,我通常将json转换为一个对象但是我将来购买的货币越多,这些类就必须动态创建,因为每个结果的标题都是货币名称?我该怎么做?
答案 0 :(得分:2)
看起来你只想要字典词典:
var json = "{\r\n\"ETH\": {\r\n \"BTC\": 0.04948,\r\n \"LKK\": 876.08,\r\n \"ETH\": 1\r\n},\r\n\"LKK\": {\r\n \"BTC\": 0.00005356,\r\n \"LKK\": 1,\r\n \"ETH\": 0.001141\r\n},\r\n\"BTC\": {\r\n \"BTC\": 1,\r\n \"LKK\": 18671.99,\r\n \"ETH\": 20.21\r\n }\r\n}";
var result = Newtonsoft.Json.JsonConvert.
DeserializeObject<Dictionary<string, Dictionary<string,float>>>(json);
结果
ETH
BTC 0.04948
LKK 876.08
ETH 1
LKK
BTC 5.356E-05
....
答案 1 :(得分:0)
您可以将json数据源反序列化为
Dictionary<string, CurrencyDescriptor>
其中CurrencyDescriptor是一个类似下面的类:
public class CurrencyDescriptor
{
public double BTC;
public double LKK;
public double ETH;
}
然后你反序列化你的json字符串:
var Dictionary<string, CurrencyDescriptor> = JsonConvert.DeserializeObject<Dictionary<string, CurrencyDescriptor>>(json);
添加新货币只需要向CurrencyDescriptor类添加新字段。
答案 2 :(得分:0)
虽然您不能直接反序列化到预定义的类(除了各种形式的词典),但最好还是为数据使用某种类型,例如:
public class CurrencyRate {
public string From { get; set; }
public string To { get; set; }
public decimal Rate { get; set; }
}
并按照以下方式反序列化:
string test = "{\r\n\"ETH\": {\r\n \"BTC\": 0.04948,\r\n \"LKK\": 876.08,\r\n \"ETH\": 1\r\n},\r\n\"LKK\": {\r\n \"BTC\": 0.00005356,\r\n \"LKK\": 1,\r\n \"ETH\": 0.001141\r\n},\r\n\"BTC\": {\r\n \"BTC\": 1,\r\n \"LKK\": 18671.99,\r\n \"ETH\": 20.21\r\n }\r\n}";
var result = JsonConvert.
DeserializeObject<Dictionary<string, Dictionary<string, decimal>>>(test);
var rates = result.SelectMany(
from => from.Value.Select(
to => new CurrencyRate{ From = from.Key, To = to.Key, Rate = to.Value })
).ToList();
在更复杂的情况下,您可以反序列化为原始JObject
并使用它:
var result = (JObject)JsonConvert.DeserializeObject(test);
您也可以使用动态:
dynamic result = JsonConvert.DeserializeObject(test);
decimal btcToEth = result.ETH.BTC;