C# 转换每个请求更改的json

C# 转换每个请求更改的json,c#,json,json.net,C#,Json,Json.net,我现在为自己制作自己的加密货币跟踪器是为了好玩,但我有点卡住了。我使用的服务是: 我拥有3种加密货币,它们使用特定代码从api中提取数据,下面是一个示例请求: 这将返回: { "ETH": { "BTC": 0.04948, "LKK": 876.08, "ETH": 1 }, "LKK": { "BTC": 0.00005356, "LKK": 1, "ETH": 0.001141 }, "BTC": { "BTC": 1,

我现在为自己制作自己的加密货币跟踪器是为了好玩,但我有点卡住了。我使用的服务是:

我拥有3种加密货币,它们使用特定代码从api中提取数据,下面是一个示例请求:

这将返回:

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

看起来您只需要一本字典:

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);

您可以将json数据源反序列化为

Dictionary<string, CurrencyDescriptor>
然后反序列化json字符串,如下所示:

public class CurrencyDescriptor
{
    public double BTC;
    public double LKK;
    public double ETH;
}
var Dictionary<string, CurrencyDescriptor> = JsonConvert.DeserializeObject<Dictionary<string, CurrencyDescriptor>>(json);
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();
var Dictionary=JsonConvert.DeserializeObject(json);

添加新货币只需要将新字段添加到CurrencyDescriptor类。

虽然不能直接反序列化到预定义类(除了各种形式的字典),但最好对数据使用某种类型,例如:

public class CurrencyRate {
    public string From { get; set; }
    public string To { get; set; }
    public decimal Rate { get; set; }
}
然后像这样反序列化:

public class CurrencyDescriptor
{
    public double BTC;
    public double LKK;
    public double ETH;
}
var Dictionary<string, CurrencyDescriptor> = JsonConvert.DeserializeObject<Dictionary<string, CurrencyDescriptor>>(json);
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();
您还可以使用dynamic:

dynamic result = JsonConvert.DeserializeObject(test);
decimal btcToEth = result.ETH.BTC;

我想让它通过一个ui运行,这样我就不能继续添加字段了。那么,建议@alexei levenkov对字典字典进行反序列化应该可以了。它足够有活力