名称动态时反序列化Json

时间:2018-11-24 09:57:33

标签: c# json json-deserialization

我使用这个简单的API https://exchangeratesapi.io/,并使用以下uri测试:https://api.exchangeratesapi.io/history?start_at=2018-01-01&end_at=2018-03-01&symbols=SEK。 我想反序列化“费率”部分。这是一个回应样本 enter image description here

这是代码

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为空。有人有什么建议吗?

1 个答案:

答案 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);
相关问题