Десериализация словаря словарей в Dictionary<string, object>

Я сериализовал словарь с именем state1 в json на С# с помощью этого кода:

string json = JsonConvert.SerializeObject(state1, Formatting.Indented);

Значением этого словаря является другой словарь, и когда я десериализую файл json обратно в словарь, значения не десериализуются как словари (я не могу преобразовать object обратно в Dictionary<string, object>):

var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);

Как правильно десериализовать json?

Если вы хотите вернуть исходную форму, вам нужно использовать исходный тип при десериализации. Что такое тип state1? Например, если это словарь словарей строк, вам нужно будет использовать это при десериализации: JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(json);.

Simon MᶜKenzie 31.12.2022 22:55

Вы должны опубликовать свой json, если вам нужна помощь

Serge 31.12.2022 23:12

Как то, трудно понять ваш вопрос. Что вы подразумеваете под первичной формой? Не могли бы вы отредактировать свой вопрос, чтобы объяснить? Вы имеете в виду, что ваш исходный словарь был типа Dictionary<string, T> для некоторого T, а когда вы его десериализовали, он стал словарем типа Dictionary<string, object>, как указано в вашем вызове JsonConvert.DeserializeObject<Dictionary<string, object>>(json);?

dbc 31.12.2022 23:14

Большое спасибо за ваш ответ. Я понял .Its<Dictionary<string, Dictionary<string, object>> . но есть ли способ превратить окончательную форму десериализованного файла в Dictionary<string, object> как var ? потому что другие функции распознают эту форму, и вы можете получить объект как другой словарь.

hesam gol 31.12.2022 23:23

Вы говорите, что у вас возникли проблемы, потому что вы не можете привести объекты к словарям из-за того, что они являются экземплярами JObject?

Simon MᶜKenzie 31.12.2022 23:29

На самом деле мой словарь похож на <Dictionary<string, Dictionary<string, object>>, и когда я десериализую файл json, другие функции его не получают. потому что они используют объект как другой словарь и нуждаются в этом: Dictionary<string, object> . есть ли другой способ превратить словарь в строку и вернуться к словарю без проблем?

hesam gol 31.12.2022 23:31

Отвечает ли это на ваш вопрос? C# приводит Dictionary<string, AnyType> к Dictionary<string, Object> (включая отражение)

Simon MᶜKenzie 31.12.2022 23:36
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы хотите вернуть исходную форму, вам нужно использовать исходный тип при десериализации.

Если, как видно из вашего комментария, это словарь словарей object, вам нужно будет использовать это при десериализации:

var values = JsonConvert
    .DeserializeObject<Dictionary<string, Dictionary<string, object>>>(json);

Если вам нужно рассматривать это как Dictionary<string, object>, при этом гарантируя, что содержимое внутреннего словаря десериализовано как словари (а не JObject), вы можете «привести» его таким образом (согласно этому ответу):

var values = JsonConvert
    .DeserializeObject<Dictionary<string, Dictionary<string, object>>>(json)
    .ToDictionary(x => x.Key, x => (object)x.Value);

Привет, как дела? Моя другая проблема с json, по-видимому, связана с тем, что у меня есть переопределение строки ToString() в моих файлах структур, и когда я пытаюсь сериализовать этот словарь (<Dictionary<string, Dictionary<string, object>>) в файл json, этот ovveride не эффективен и при десериализации файла и возврате значений в структуру возникают ошибки. есть ли решение?

hesam gol 01.01.2023 23:34

Привет @hesamgol, трудно сказать, не видя вашего кода, но вам может понадобиться использовать собственный Jsonconverter, если вы используете Newtonsoft: newtonsoft.com/json/help/html/JsonConverterAttributeClass.ht‌​m. Вероятно, вам следует задать новый вопрос о Stackoverflow, показывающем ваш код.

Simon MᶜKenzie 02.01.2023 00:02

Tnx за ответ на мой вопрос. Я думаю, что вы правы, но я не знаю, как это использовать. плохо сделать новый вопрос. tnx братан

hesam gol 02.01.2023 21:06

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