Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you serialize an enum array to a Json array of strings? [duplicate]

Based on Diego's unanswered comment under the top-voted answer in this question:

JSON serialization of enum as string

So for an enum:

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

And for eg. a property:

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

To something like the JSON:

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

instead of

{ContactTypes : [0,1,2]}

As is the case with the normal JavaScriptSerializer?

like image 592
Mark Gibaud Avatar asked Feb 19 '13 17:02

Mark Gibaud


2 Answers

It would appear that in one of the later versions of Json.NET there is proper provision for this, via the ItemConverterType property of the JsonProperty attribute, as documented here:

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

I was unable to try it out as I hit problems upgrading from Json.NET 3.5 that were related to my own project. In the end I converted my viewmodel to IEnumerable<string> as per Shmiddty's suggestion (there is still an impedance mismatch though and I will come back to refactor this in future).

Hope that helps anyone else with the same problem!

Example usage:

[JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
IEnumerable<ContactType> AvailableContactTypes {get;set;} 
like image 150
Mark Gibaud Avatar answered Sep 27 '22 22:09

Mark Gibaud


I've always found it easier to add an additional property in these cases than to try to change the behavior of the json.net parser.

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

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

Of course, if you need to deserialize, you'd need a setter on that property as well.

set { AvailableContactTypes = value
    .Select(c => Enum.Parse(typeof(ContactType), c) as ContactType); }
like image 44
Jeff-Meadows Avatar answered Sep 27 '22 21:09

Jeff-Meadows