Json.NET десериализовывает список выбора / множественный выбор
Я сериализовал MultiSelectList с Json.NET в ASP.NET (с включенным TypeNameHandling), и это дало следующий результат:
"MyMultiSelectList": {
"$type": "System.Web.Mvc.MultiSelectList, System.Web.Mvc",
"$values": [
{
"Disabled": false,
"Selected": true,
"Text": "Text1",
"Value": "Value1"
},
{
"Disabled": false,
"Selected": false,
"Text": "Text2",
"Value": "Value2"
},
{
"Disabled": false,
"Selected": false,
"Text": "Text3",
"Value": "Value3"
}
]
}
При десериализации этого Json обратно в MultiSelectList без каких-либо пользовательских преобразователей с использованием этого метода, я получаю MultiSelectList с 3 SelectListItems, где их свойство Text установлено в "System.Web.Mvc.SelectListItem", а их свойство Value пусто.
Во-первых, я предположил, что Json.NET не сможет правильно десериализовать SelectListItems, поэтому я создал пользовательский JsonConverter для типа SelectListItem. Мой конвертер правильно создал SelectListItems, но результат остался прежним.
Затем я попытался создать собственный преобразователь для типа MultiSelectList, но этот код никогда не вызывается Json.NET.
Возможно, эта проблема связана с тем, что MultiSelectList не имеет пустого конструктора по умолчанию, но у меня нет вариантов, чтобы попробовать.
1 ответ
Создайте пользовательский класс с помощью QuickType:
public class CustomSelectList
{
[JsonProperty("MyMultiSelectList")]
public MyMultiSelectList MyMultiSelectList { get; set; }
}
public class MyMultiSelectList
{
[JsonProperty("$type")]
public string Type { get; set; }
[JsonProperty("$values")]
public Value[] Values { get; set; }
}
public class Value
{
[JsonProperty("Disabled")]
public bool Disabled { get; set; }
[JsonProperty("Selected")]
public bool Selected { get; set; }
[JsonProperty("Text")]
public string Text { get; set; }
[JsonProperty("Value")]
public string ValueValue { get; set; }
}
десериализовать это
var customList = JsonConvert.DeserializeObject<CustomSelectList>(json);
а затем загрузить его в список
foreach (var item in customList.MyMultiSelectList.Values)
multiSelectList.Add(new SelectListItem{ Value= item.ValueValue, Text=item.Text });
и заполните MultiSelectList (еще не проверено)
var multiList = new MultiSelectList(list);
Другой подход заключается в том, чтобы загрузить его в структуру данных, которая сначала поддерживает сериализацию (например, List<KeyValuePair<string,string>>
:
var serializableList = new List<KeyValuePair<string, string>>();
foreach(var item in selectList)
serializableList.Add(new KeyValuePair<string, string>(item.Text, item.Value));
А затем сериализовать serializableList
, ты получишь
[{"Key":"select item value","Value":"select item text"}]
Если вы хотите сохранить больше информации, например, выбран ли элемент, вы можете сделать List<Tuple<string,string,bool>>
когда вам нужно восстановить MultiSelectList
, просто десериализовать его, добавить его в List<SelectListItem>
а затем передать список для создания MultiSelectList (new MultiSelectLust(list)
)