Десериализовать Json, когда имя динамическое - PullRequest
0 голосов
/ 24 ноября 2018

Я использую этот простой 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);

Моя проблема в том, что это поле равно нулю.У кого-нибудь есть предложения?

1 Ответ

0 голосов
/ 24 ноября 2018

Если ваша пара ключ / значение не является фиксированной и данные должны быть конфигурируемыми, то в Newtonsoft.json есть одна особенность, которая будет использоваться здесь, и это [JsonExtensionData]. Подробнее

Данные расширения теперь записываются при сериализации объекта.Чтение и запись данных расширения позволяет автоматически выполнять обход всех JSON без добавления каждого свойства к типу .NET, к которому вы десериализуетесь.Объявите только те свойства, которые вас интересуют, и пусть данные расширений сделают все остальное.

В вашем случае ключ rates имеет значение в качестве динамических данных, поэтому ваш класс Rate будет

public class Rate
{
    [JsonExtensionData]
    public Dictionary<string, JToken> Fields { get; set; }
}

И тогда вы можете десериализовать ваш ответный контент как

var result = Newtonsoft.Json.JsonConvert.DeserializeObject<ExchangeRate>(response.Content);
...