This question already has an answer here:
-
Serialize a container of enums as strings using JSON.net
2 answers
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?
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); }
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;}