Json.NET反序列化选择列表/多选择列表

时间:2018-11-19 12:16:09

标签: asp.net json json.net selectlist selectlistitem

我在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没有默认的空构造函数有关,但是我没有尝试的选择。

1 个答案:

答案 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)