Here is a simple solution that serializes a server-side C# enum to JSON and uses the result to populate a client-side <select> element. This works for both simple enums and bitflag enums.
I have included the end-to-end solution because I think most people wanting to serialize a C# enum to JSON will also probably be using it to fill a <select> drop-down.
Here goes:
Example Enum
public enum Role { None = Permission.None, Guest = Permission.Browse, Reader = Permission.Browse| Permission.Help , Manager = Permission.Browse | Permission.Help | Permission.Customise }
A complex enum that uses bitwise ORs to generate a permissions system. So you can't rely on the simple index [0,1,2..] for the integer value of the enum.
Server Side - C#
Get["/roles"] = _ => { var type = typeof(Role); var data = Enum .GetNames(type) .Select(name => new { Id = (int)Enum.Parse(type, name), Name = name }) .ToArray(); return Response.AsJson(data); };
The code above uses the NancyFX framework to handle the Get request. It uses Nancy's Response.AsJson() helper method - but don't worry, you can use any standard JSON formatter as the enum has already been projected into a simple anonymous type ready for serialization.
Generated JSON
[ {"Id":0,"Name":"None"}, {"Id":2097155,"Name":"Guest"}, {"Id":2916367,"Name":"Reader"}, {"Id":4186095,"Name":"Manager"} ]
Client Side - CoffeeScript
fillSelect=(id, url, selectedValue=0)-> $select = $ id $option = (item)-> $ "<option/>", { value:"#{item.Id}" html:"#{item.Name}" selected:"selected" if item.Id is selectedValue } $.getJSON(url).done (data)->$option(item).appendTo $select for item in data $ -> fillSelect "#role", "/roles", 2916367
HTML Before
<select id="role" name="role"></select>
HTML After
<select id="role" name="role"> <option value="0">None</option> <option value="2097155">Guest</option> <option value="2916367" selected="selected">Reader</option> <option value="4186095">Manager</option> </select>