Не удалось преобразовать значение JSON в System.Collections.Generic.Dictionary`2[System.String,System.String]

Перед сериализацией -

 "welcomePageConfig": {
        "welcomeTitleText": {
            "style": {
                "color": "#FFFFFF"
            },
            "content": {
                "sv": "Välkommen",
                "en": "Welcome"
            }
        }

Я использую JsonSerializer для десериализации строки ниже объекта.

string jsonString = JsonSerializer.Serialize(welcomePageConfig);

После сериализации -

{\"WelcomeTitleText\":{\"Style\":{\"Color\":\"#FFFFFF\"},\"Content\":[{\"Key\":\"sv\",\"Value\":\"Välkommen\"},{\"Key\":\"en\",\"Value\":\"Welcome\"}]}

welcomePageConfig = JsonSerializer.Deserialize<WelcomePageConfig>(jsonString);

Когда я пытаюсь десериализовать, мне выдает ошибку с упоминанием «Не удалось преобразовать значение JSON в System.Collections.Generic.Dictionary`2[System.String,System.String]».

Он появляется после "{"Ключ..." этой части. Так как это словарь.

public class WelcomePageConfig
    {
        [JsonProperty("welcomeTitleText")]
        public StylingComponent WelcomeTitleText { get; set; }
    }

public class StylingComponent
    {
        [JsonProperty("style")]
        public Style Style { get; set; }

        [JsonProperty("content")]
        public Dictionary<string, string> Content { get; set; }
    }

Как решить эту проблему?

Пожалуйста, покажите свою реализацию класса WelcomePageConfig.

Yong Shun 20.04.2023 10:06

этот список объектов, на которые вы указываете, не является словарем; Элемент словаря имеет свойства Key и Value, а не Key1 Value, Key2 Value, Key3 Value; Имя свойства не может измениться, если вы не напишете собственный преобразователь, который будет игнорировать число в имени и создавать словарь.

Rafal 20.04.2023 10:08

Существует два способа сериализации словаря: либо в виде массива пар ключ-значение, либо в виде нотации json "object". У вас есть массив пар ключ-значение. Чтобы ответить на вопрос, нам нужно увидеть определение WelcomePageConfig.

Ben 20.04.2023 10:36

@Rafal Извините, я скопировал не тот json. Теперь я обновился с правильным. Он содержит ключ и значение, а не ключ1 и ключ2

Hash_Dew 20.04.2023 10:50

@Ben Я обновил вопрос, добавив больше информации

Hash_Dew 20.04.2023 10:56

@Hash_Dew Что означает «Перед сериализацией»? Почему данные разные? Должно быть одинаково. Можете ли вы показать, как вы его сериализуете, пожалуйста?

Serge 20.04.2023 12:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
6
186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Существует довольно распространенное соглашение о том, что Dictionary<string, ...> обрабатывается как объект JSON во время (де)сериализации, это соглашение, например, поддерживается как System.Text.Json, так и Json.NET от Newtonsoft. Кажется, что в какой-то момент во время сериализации что-то идет не так, как ожидалось (вы не показали свой код сериализации), и Content обрабатывается как IEnumerable (пар ключ-значение), а не как Dictionary, поэтому вам нужно изменить модель для десериализации :

public class StylingComponent
{
    // ...
    public List<KeyValuePair<string, string>> Content { get; set; }
}

Это код сериализации — string jsonString = JsonSerializer.Serialize(welcomePageConfig); После использования keyValuePairs он не дает никаких ошибок, но не десериализуется. Объекты устанавливаются в null после десериализации.

Hash_Dew 20.04.2023 14:23

@Hash_Dew нет кода сериализации - только код десериализации: welcomePageConfig = JsonSerializer.Deserialize<List<WelcomePageConfig>>(jsonStri‌​ng); .

Guru Stron 20.04.2023 14:25

Только что обновил вопрос с этим кодом. Взгляни, пожалуйста.

Hash_Dew 20.04.2023 14:27

@Hash_Dew посмотрите демо. Ваше обновление не имеет смысла — JSON содержит один объект, пока вы пытаетесь десериализовать его в коллекцию.

Guru Stron 20.04.2023 14:34

@Hash_Dew JsonPropertyAttribute является атрибутом Newtonsoft Json.NET и будет игнорироваться JsonSerializer.Deserialize.

Guru Stron 20.04.2023 14:35

Я попытался упростить вопрос, чтобы сделать его более понятным, и натворил там путаницы. В любом случае встроенный сериализатор json у меня не сработал. Но я использовал сериализатор newtonsoft, тогда он сработал. Большое спасибо за помощь.

Hash_Dew 21.04.2023 07:21

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