Десериализовать Json, когда имя динамическое

Я использую этот простой API, https://exchangeratesapi.io/, и тестирую с этим uri: https://api.exchangeratesapi.io/history?start_at=2018-01-01&end_at=2018-03-01&symbols=SEK. Я хочу десериализовать часть «ставки». Вот один пример ответа Десериализовать Json, когда имя динамическое

А вот код

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 24.11.2018 11:04

@Matthijs Я только что обновил вопрос

ShrnPrmshr 24.11.2018 11:08

@ShrnPrmshr отсылайте к этому stackoverflow.com/a/53447976/4425004

Pranesh Janarthanan 24.11.2018 11:50

Ставки свойств @ShrnPrmshr находятся в массиве, десериализация массива затруднена, возможно ли изменить структуру данных в виде списка и выделить эту часть даты внутри ставок как [{ "Logdate": "2018-10-26", "SEK":9.823},{...}]. чтобы его можно было легко десериализовать.

Pranesh Janarthanan 24.11.2018 11:53

См. Комментарии г-на СэМ к этому вопросу stackoverflow.com/q/53447346/4425004, также подход к этому здесь c-sharpcorner.com/article/…

Pranesh Janarthanan 24.11.2018 12:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Extension data is now written when an object is serialized. Reading and writing extension data makes it possible to automatically round-trip all JSON without adding every property to the .NET type you’re deserializing to. Only declare the properties you’re interested in and let extension data do the rest.

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

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

А затем вы можете десериализовать содержимое ответа как

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

Другие вопросы по теме