How to tell JSON.NET StringEnumConverter to take DisplayName?

29,744

Solution 1

You should try using [EnumMember] instead of [Display]. You can also put the [JsonConverter] attribute on the enum itself.

[JsonConverter(typeof(StringEnumConverter))]
public enum Status
{
    [EnumMember(Value = "Awaiting Approval")]
    AwaitingApproval,
    Rejected,
    Accepted,
}

The VB.NET version for the JsonConverter attribute is:

<Newtonsoft.Json.JsonConverter(GetType(Newtonsoft.Json.Converters.StringEnumConverter))>

Solution 2

In WebAPI the best option is to globally convert all enum string in JSON with Description value

  1. In Model use this namespace using Newtonsoft.Json.Converters;

    public class Docs
    {
    [Key]
    public int Id { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public Status Status { get; set; }
    }
    
  2. In Enum use this namespace using System.Runtime.Serialization; for EnumMember

    public enum Status
    {
    [EnumMember(Value = "Awaiting Approval")]
    AwaitingApproval,
    Rejected,
    Accepted,
    }
    
  3. In Global.asax add this code

        protected void Application_Start()
        {
          GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());
    
        }
    

It will work fine return enum in JSON using WebAPI.

Solution 3

I tried this and got the error type or namespace enum member could not be found... So you guys might get this error too so you need to use

using System.Runtime.Serialization;

and still you get this error then add a reference like below:

Right click on your project -> Add -> Reference.. -> Assemblies -> Mark System.Runtime.Serialization (i have 4.0.0.0 version ) -> Ok

Now you can proceed like this:

[JsonConverter(typeof(StringEnumConverter))]
public enum Status
{
    [EnumMember(Value = "Awaiting Approval")]
    AwaitingApproval,
    Rejected,
    Accepted,
}
Share:
29,744

Related videos on Youtube

Irshu
Author by

Irshu

All things politics, economics, tech and software engineering.

Updated on July 25, 2020

Comments

  • Irshu
    Irshu almost 4 years

    I've got the following model:

    public enum Status
    {
        [Display(Name = "Awaiting Approval")]
        AwaitingApproval,
        Rejected,
        Accepted,
    }
    

    I use this enum in a model like this:

    public class Docs
        {
            [Key]
            public int Id { get; set; }
            [JsonConverter(typeof(StringEnumConverter))]
            public Status Status { get; set; }
        }
    

    Now this works fine; the serializer returns the string equivalent of the enum. My question is how to tell JSON.NET to take the Display attribute instead of the string?

  • Richard B
    Richard B about 9 years
    This doesn't seem to support i18n scenarios. Can you elaborate and explain if this is indeed accurate, or if there is a way to internationalize the text shown on screen?
  • RJ Cuthbertson
    RJ Cuthbertson almost 9 years
    @RichardB you would use the DisplayAttribute for i18n scenarios.