Json.NET десериализует список выбора / множественный выбор - PullRequest
0 голосов
/ 19 ноября 2018

Я сериализовал 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» и их Значение свойства пусто.

Во-первых, я предположил, что Json.NET не удалась десериализовать SelectListItems правильно, поэтому я создал Пользовательский JsonConverter для типа SelectListItem. Мой конвертер правильно создал SelectListItems, но результат остался прежним.

Затем я попытался создать собственный преобразователь для типа MultiSelectList, но этот код никогда не вызывается Json.NET.

Возможно, эта проблема связана с тем, что MultiSelectList не имеет пустого конструктора по умолчанию, но у меня нет вариантов, чтобы попробовать.

1 Ответ

0 голосов
/ 19 ноября 2018

Создание пользовательского класса с помощью 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))

...