Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScriptSerializer - JSON serialization of enum as string

I have a class that contains an enum property, and upon serializing the object using JavaScriptSerializer, my json result contains the integer value of the enumeration rather than its string "name". Is there a way to get the enum as a string in my json without having to create a custom JavaScriptConverter? Perhaps there's an attribute that I could decorate the enum definition, or object property, with?

As an example:

enum Gender { Male, Female }  class Person {     int Age { get; set; }     Gender Gender { get; set; } } 

Desired JSON result:

{ "Age": 35, "Gender": "Male" } 

Ideally looking for answer with built-in .NET framework classes, if not possible alternatives (like Json.net) are welcome.

like image 873
Omer Bokhari Avatar asked Mar 14 '10 05:03

Omer Bokhari


1 Answers

I have found that Json.NET provides the exact functionality I'm looking for with a StringEnumConverter attribute:

using Newtonsoft.Json; using Newtonsoft.Json.Converters;  [JsonConverter(typeof(StringEnumConverter))] public Gender Gender { get; set; } 

More details at available on StringEnumConverter documentation.

There are other places to configure this converter more globally:

  • enum itself if you want enum always be serialized/deserialized as string:

    [JsonConverter(typeof(StringEnumConverter))]   enum Gender { Male, Female } 
  • In case anyone wants to avoid attribute decoration, you can add the converter to your JsonSerializer (suggested by Bjørn Egil):

    serializer.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());  

    and it will work for every enum it sees during that serialization (suggested by Travis).

  • or JsonConverter (suggested by banana):

    JsonConvert.SerializeObject(MyObject,      new Newtonsoft.Json.Converters.StringEnumConverter()); 

Additionally you can control casing and whether numbers are still accepted by using StringEnumConverter(NamingStrategy, Boolean) constructor.

like image 176
Omer Bokhari Avatar answered Oct 22 '22 01:10

Omer Bokhari