我在ASP.NET中使用Json.NET对MultiSelectList进行了序列化(启用了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"
}
]
}
当使用this method将此Json反序列化为不带任何自定义转换器的MultiSelectList时,我得到一个带有3个SelectListItems的MultiSelectList,其文本属性设置为“ System.Web.Mvc.SelectListItem”,其Value属性为空的。
首先,我假设Json.NET无法正确反序列化SelectListItems,因此我为SelectListItem类型制作了一个Custom JsonConverter。我的转换器正确创建了SelectListItems,但结果仍然相同。
然后,我尝试为MultiSelectList类型创建自定义转换器,但是Json.NET从未调用该代码。
也许这个问题与MultiSelectList没有默认的空构造函数有关,但是我没有尝试的选择。
答案 0 :(得分:0)
使用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)
)