名称为动态时反序列化 Json

Shr*_*shr 3 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。我想反序列化“费率”部分。这是一个响应示例 在此处输入图片说明

这是代码

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; }
}
Run Code Online (Sandbox Code Playgroud)

或者

public class Rate
{
    [JsonProperty]
    public string CurrencyName { get; set; }
    [JsonProperty]
    public double CurrencyRate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我像这样对它进行消毒

var result = Newtonsoft.Json.JsonConvert.DeserializeObject<ExchangeRateHistory>(response.Content);
Run Code Online (Sandbox Code Playgroud)

我的问题是 Fields 为空。有人有什么建议吗?

er-*_*sho 6

如果您的键/值对不是固定的并且数据必须是可配置的,那么 Newtonsoft.json 有一个可以在这里使用的功能,那就是[JsonExtensionData]. 阅读更多

现在在对象序列化时写入扩展数据。读取和写入扩展数据使自动往返所有 JSON 成为可能,而无需将每个属性添加到您要反序列化的 .NET 类型。只声明您感兴趣的属性,让扩展数据完成其余的工作。

在您的情况下,rates键具有作为动态数据的价值,因此您的Rate课程将是

public class Rate
{
    [JsonExtensionData]
    public Dictionary<string, JToken> Fields { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以将您的响应内容反序列化为

var result = Newtonsoft.Json.JsonConvert.DeserializeObject<ExchangeRate>(response.Content);
Run Code Online (Sandbox Code Playgroud)