Перед сериализацией -
"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; }
}
Как решить эту проблему?
этот список объектов, на которые вы указываете, не является словарем; Элемент словаря имеет свойства Key и Value, а не Key1 Value, Key2 Value, Key3 Value; Имя свойства не может измениться, если вы не напишете собственный преобразователь, который будет игнорировать число в имени и создавать словарь.
Существует два способа сериализации словаря: либо в виде массива пар ключ-значение, либо в виде нотации json "object". У вас есть массив пар ключ-значение. Чтобы ответить на вопрос, нам нужно увидеть определение WelcomePageConfig.
@Rafal Извините, я скопировал не тот json. Теперь я обновился с правильным. Он содержит ключ и значение, а не ключ1 и ключ2
@Ben Я обновил вопрос, добавив больше информации
@Hash_Dew Что означает «Перед сериализацией»? Почему данные разные? Должно быть одинаково. Можете ли вы показать, как вы его сериализуете, пожалуйста?
Существует довольно распространенное соглашение о том, что 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 нет кода сериализации - только код десериализации: welcomePageConfig = JsonSerializer.Deserialize<List<WelcomePageConfig>>(jsonString);
.
Только что обновил вопрос с этим кодом. Взгляни, пожалуйста.
@Hash_Dew посмотрите демо. Ваше обновление не имеет смысла — JSON содержит один объект, пока вы пытаетесь десериализовать его в коллекцию.
@Hash_Dew JsonPropertyAttribute
является атрибутом Newtonsoft Json.NET и будет игнорироваться JsonSerializer.Deserialize
.
Я попытался упростить вопрос, чтобы сделать его более понятным, и натворил там путаницы. В любом случае встроенный сериализатор json у меня не сработал. Но я использовал сериализатор newtonsoft, тогда он сработал. Большое спасибо за помощь.
Пожалуйста, покажите свою реализацию класса
WelcomePageConfig
.