我使用这个简单的API https://exchangeratesapi.io/,并使用以下uri测试:https://api.exchangeratesapi.io/history?start_at=2018-01-01&end_at=2018-03-01&symbols=SEK。 我想反序列化“费率”部分。这是一个回应样本
这是代码
public class ExchangeRate
{
[JsonProperty(PropertyName = "end_at", Order = 1)]
public DateTime EndAt { get; set; }
[JsonProperty(PropertyName = "start_at", Order = 2)]
public DateTime StartAt { get; set; }
[JsonProperty(PropertyName = "rates", Order = 3)]
public Dictionary<string, Rate> Rates { get; set; }
[JsonProperty(PropertyName = "base", Order = 4)]
public string Base { get; set; }
}
public class Rate
{
[JsonProperty]
public Dictionary<string, double> Fields{ get; set; }
}
或
public class Rate
{
[JsonProperty]
public string CurrencyName { get; set; }
[JsonProperty]
public double CurrencyRate { get; set; }
}
我像这样对它进行杀菌
var result = Newtonsoft.Json.JsonConvert.DeserializeObject<ExchangeRateHistory>(response.Content);
我的问题是Fields为空。有人有什么建议吗?
答案 0 :(得分:4)
如果键/值对不是固定的,并且数据必须可配置,则Newtonsoft.json具有一个要在此处使用的功能,即[JsonExtensionData]
。 Read more
现在,序列化对象时将写入扩展数据。读取和写入扩展数据可以自动往返所有JSON,而无需将所有属性添加到要反序列化的.NET类型。仅声明您感兴趣的属性,然后让扩展数据完成其余工作。
在您的情况下,rates
键具有作为动态数据的值,因此您的Rate
类将是
public class Rate
{
[JsonExtensionData]
public Dictionary<string, JToken> Fields { get; set; }
}
然后您可以将响应内容反序列化为
var result = Newtonsoft.Json.JsonConvert.DeserializeObject<ExchangeRate>(response.Content);