Десериализовать JSON с помощью вложенного словаря с DateTime в качестве ключаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 Десериализовать JSON с помощью вложенного словаря с DateTime в качестве ключа

Сообщение Гость »


Я пытаюсь десериализовать JSON с помощью вложенного словаря. Я не могу изменить структуру JSON, поэтому мне нужно десериализовать его как есть -

JSON-

{ "сессия": { «ID пользователя»: 111, "SessionKey": "аааа", «Культура»: «en-CA» }, "targetImports": { "SalesKPIName": "NetSales", «ТипИмпорта»: 0, «Тип распределения»: 0, «Тип распределения периода»: 0, "SpecificApportionPeriod": "2023-09-20T09:56:42", «Импортировать KPI»: [ { «ИмпортKPI»: «Продажи», «Соответствие KPI»: { «КПИИД»: 2, «Имя»: «NetSales», «Описание»: «Продажи», «Выражение»: «NetSales», "ReturnType": "System.Double", «ЧисловойФорматИД»: 2, «Точность»: 0, «Перенести вперед»: ложь, «IsSummed»: правда, «Распределено»: правда, «IsTargetCalculated»: ложь, «UsesQuarterRounding»: ложь, «UseFlatAppportioning»: ложь }, «КПИИД»: 2, «Описание»: «Продажи», "уид": 0 } ], "TargetsToImport": { "113": { «Цели»: { "ключи": [ "09.03.2023" ], "ценности": [ { "TargetValues": { "ключи": [ "Продажи" ], "ценности": [ 19892 ], «Продажи»: 19892 } } ], "09.03.2023": { "TargetValues": { "ключи": [ "Продажи" ], "ценности": [ 19892 ], «Продажи»: 19892 } } } }, "ключи": [ "113" ], "ценности": [ { «Цели»: { "ключи": [ "09.03.2023" ], "ценности": [ { "TargetValues": { "ключи": [ "Продажи" ], "ценности": [ 19892 ], «Продажи»: 19892 } } ], "09.03.2023": { "TargetValues": { "ключи": [ "Продажи" ], "ценности": [ 19892 ], «Продажи»: 19892 } } } } ] }, «TotalDistributionValue»: 0, «TotalWeeklyDistributionValue»: 0 }, "importKPI": "Продажи,2", "targetsToImport": "113|2023-09-03:Продажи^19892!,;", «выбранные недели»: ноль, "selectedPeriod": "20 сентября 2023 г.", «ignoreClosedHoursForApportioning»: ложь

Объект класса -

общедоступный класс ProcessTargetsRequest { публичная сессия сеанса {get; набор; } общественный TargetImports targetImports {получить; набор; } общедоступная строка? importKPIs {получить; набор; } общедоступная строка? целиToImport {получить; набор; } общедоступная строка? selectedWeeks {получить; набор; } общедоступная строка? selectedPeriod {получить; набор; } public bool ignoreClosedHoursForApportioning {get; набор; } } публичный класс TargetImports { общественный TargetImportTypes importType {get; набор; } общественный ApportioningTypes apportioningType {get; набор; } общественный PeriodApportioningTypes periodApportioningType {get; набор; } общественный список importKPIs {get; набор; } общественный List selectedWeeks {get; набор; } общественный список customDistribution {get; набор; } общественный список customWeeklyDistribution {get; набор; } общественный словарь целиToImport {get; набор; } общественный двойной TotalDistributionValue {получить; набор; } } Ошибка, которую я получил в TargetImportRow, и класс для нее следующий -

общедоступный класс TargetImportRow { public Dictionary цели {get; набор; } } общедоступный класс ImportTargets { общедоступный словарь targetValues ​​{get;set;} } Как вы видите, ключом словаря здесь является DateTime, и JSON.NET это не нравится. Я пытался написать конвертер, но мои словари вложены, поэтому у меня ничего не получилось. Конвертер -

публичный класс DictionaryConverter: JsonConverter { общедоступное переопределение bool CanConvert (Тип objectType) { return objectType == typeof(Dictionary); } общедоступный объект переопределения ReadJson (читатель JsonReader, тип objectType, объект ExistValue, сериализатор JsonSerializer) { вар словарь = новый словарь(); если (reader.TokenType == JsonToken.StartObject) { while (reader.Read() && reader.TokenType != JsonToken.EndObject) { если (reader.TokenType == JsonToken.PropertyName) { // Анализируем имя свойства (строку) как DateTime if (DateTime.TryParse(reader.Value.ToString(), out DateTime dateTimeKey)) { TKey typedKey = (TKey)Convert.ChangeType(dateTimeKey, typeof(TKey)); читатель.Читать(); // Переходим к значению свойства Значение TValue = сериализатор.Deserialize(читатель); словарь[typedKey] = значение; } } } } вернуть словарь; } общедоступное переопределение void WriteJson (писатель JsonWriter, значение объекта, сериализатор JsonSerializer) { // При необходимости реализуем логику сериализации выбросить новое NotImplementedException(); } } Кто-нибудь сталкивался с этой проблемой и нашел решение, пожалуйста, помогите мне
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»