转换每个请求更改的json

时间:2017-11-11 21:27:16

标签: c# json json.net

我目前正在为自己创建自己的加密货币跟踪器,这有点好玩,但我有点卡住了。我正在使用的服务是:

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转换为一个对象但是我将来购买的货币越多,这些类就必须动态创建,因为每个结果的标题都是货币名称?我该怎么做?

3 个答案:

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