Comment sérigraphier un réseau d'énumération dans un ensemble de chaînes Json?

Basé sur le commentaire sans réponse de Diego sous la réponse la plus votée dans cette question:

JSON sérialisation d'enum en tant que chaîne

Donc pour un énoncé:

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

Et pour par exemple. une propriété:

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

À quelque chose comme le JSON:

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

au lieu de

 {ContactTypes : [0,1,2]} 

Comme c'est le cas avec le JavaScriptSerializer normal?

J'ai toujours trouvé plus facile d'ajouter une propriété supplémentaire dans ces cas que d'essayer de modifier le comportement de l'analyseur json.net.

 [JsonIgnore] IEnumerable<ContactType> AvailableContactTypes {get;set;} IEnumerable<string> AvailableContactTypesString { get { return AvailableContactTypes.Select(c => c.ToString()); } } 

Bien sûr, si vous avez besoin de désérialiser, vous devriez également avoir besoin d'un setter sur cette propriété.

 set { AvailableContactTypes = value .Select(c => Enum.Parse(typeof(ContactType), c) as ContactType); } 

Il semblerait que, dans l'une des versions ultérieures de Json.NET, il existe une disposition appropriée pour cela, via la propriété ItemConverterType de l'attribut JsonProperty , comme documenté ici:

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

Je n'ai pas pu l'essayer car j'ai frappé les problèmes de mise à niveau de Json.NET 3.5 qui étaient liés à mon propre projet. En fin de compte, j'ai converti mon modèle de vision en IEnumerable<string> selon la suggestion de Shmiddty (il y a encore une incompatibilité d'impédance et je reviendrai pour refactoriser cela à l'avenir).

J'espère que cela aidera quelqu'un d'autre avec le même problème!