【问题标题】:Deserialize Json when name is dynamic当名称是动态的时反序列化 Json
【发布时间】:2018-11-24 09:57:32
【问题描述】:

我使用这个简单的 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);

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

【问题讨论】:

  • 你能告诉我们如何你反序列化 JSON 吗?这是问题的关键部分:-)
  • @Matthijs 我刚刚更新了问题
  • @ShrnPrmshr 参考这个stackoverflow.com/a/53447976/4425004
  • @ShrnPrmshr 属性值在数组中,反序列化数组很困难,是否可以将数据结构更改为列表,并将速率中的日期部分设为[{ "Logdate": "2018-10-26", "SEK":9.823},{...}]。以便它可以轻松反序列化。
  • 参考 SeM 先生在这个问题下给出的 cmets stackoverflow.com/q/53447346/4425004 这样做的方法也在这里c-sharpcorner.com/article/…

标签: c# json json-deserialization


【解决方案1】:

如果您的键/值对不是固定的并且数据必须是可配置的,那么 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多