Как вы сериализуете массив enum в массив строк Json?

javascript json.net javascriptserializer

1829 просмотра

2 ответа

На основании оставленного без ответа комментария Диего под самым популярным ответом на этот вопрос:

JSON-сериализация enum как строки

Итак, для перечисления:

public enum ContactType
{
    Phone = 0,
    Email = 1,
    Mobile = 2
}

И к примеру. недвижимость:

//could contain ContactType.Phone, ContactType.Email, ContactType.Mobile
IEnumerable<ContactType> AvailableContactTypes {get;set;} 

Для чего-то вроде JSON:

{ContactTypes : ['Phone','Email','Mobile']}

вместо

{ContactTypes : [0,1,2]}

Как обстоят дела с обычным JavaScriptSerializer?

Автор: Mark Gibaud Источник Размещён: 12.11.2019 09:17

Ответы (2)


2 плюса

Мне всегда было проще добавить дополнительное свойство в этих случаях, чем пытаться изменить поведение анализатора json.net.

[JsonIgnore]
IEnumerable<ContactType> AvailableContactTypes {get;set;}

IEnumerable<string> AvailableContactTypesString
{
    get { return AvailableContactTypes.Select(c => c.ToString()); }
}

Конечно, если вам нужно десериализовать, вам также понадобится установщик этого свойства.

set { AvailableContactTypes = value
    .Select(c => Enum.Parse(typeof(ContactType), c) as ContactType); }
Автор: Jeff-Meadows Размещён: 19.02.2013 06:23

1 плюс

Решение

Может показаться, что в одной из более поздних версий Json.NET для этого есть соответствующее условие через ItemConverterTypeсвойство JsonPropertyатрибута, как описано здесь:

http://james.newtonking.com/archive/2012/05/08/json-net-4-5-release-5-jsonproperty-enhancements.aspx

Я не смог попробовать это, так как столкнулся с проблемами при обновлении с Json.NET 3.5, которые были связаны с моим собственным проектом. В конце я преобразовал свою модель представления IEnumerable<string>в соответствии с предложением Шмидти (хотя все еще существует несоответствие импеданса, и я вернусь, чтобы реорганизовать это в будущем).

Надеюсь, это поможет кому-то еще с той же проблемой!

Пример использования:

[JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
IEnumerable<ContactType> AvailableContactTypes {get;set;} 
Автор: Mark Gibaud Размещён: 20.02.2013 11:21
Вопросы из категории :
32x32