JavaScriptSerializer - JSON serialization of enum as string

后端 未结 27 1697
耶瑟儿~
耶瑟儿~ 2020-11-22 03:22

I have a class that contains an enum property, and upon serializing the object using JavaScriptSerializer, my json result contains the integer valu

相关标签:
27条回答
  • 2020-11-22 03:55

    For ASP.Net core Just add the following to your Startup Class:

    JsonConvert.DefaultSettings = (() =>
            {
                var settings = new JsonSerializerSettings();
                settings.Converters.Add(new StringEnumConverter { AllowIntegerValues = false });
                return settings;
            });
    
    0 讨论(0)
  • 2020-11-22 03:58

    I wasn't able to change the source model like in the top answer (of @ob.), and I didn't want to register it globally like @Iggy. So I combined https://stackoverflow.com/a/2870420/237091 and @Iggy's https://stackoverflow.com/a/18152942/237091 to allow setting up the string enum converter on during the SerializeObject command itself:

    Newtonsoft.Json.JsonConvert.SerializeObject(
        objectToSerialize, 
        Newtonsoft.Json.Formatting.None, 
        new Newtonsoft.Json.JsonSerializerSettings()
        {
            Converters = new List<Newtonsoft.Json.JsonConverter> {
                new Newtonsoft.Json.Converters.StringEnumConverter()
            }
        })
    
    0 讨论(0)
  • 2020-11-22 03:59

    Noticed that there is no answer for serialization when there is a Description attribute.

    Here is my implementation that supports the Description attribute.

    public class CustomStringEnumConverter : Newtonsoft.Json.Converters.StringEnumConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            Type type = value.GetType() as Type;
    
            if (!type.IsEnum) throw new InvalidOperationException("Only type Enum is supported");
            foreach (var field in type.GetFields())
            {
                if (field.Name == value.ToString())
                {
                    var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
                    writer.WriteValue(attribute != null ? attribute.Description : field.Name);
    
                    return;
                }
            }
    
            throw new ArgumentException("Enum not found");
        }
    }
    

    Enum:

    public enum FooEnum
    {
        // Will be serialized as "Not Applicable"
        [Description("Not Applicable")]
        NotApplicable,
    
        // Will be serialized as "Applicable"
        Applicable
    }
    

    Usage:

    [JsonConverter(typeof(CustomStringEnumConverter))]
    public FooEnum test { get; set; }
    
    0 讨论(0)
  • 2020-11-22 03:59

    And for VB.net I found the following works:

    Dim sec = New Newtonsoft.Json.Converters.StringEnumConverter()
    sec.NamingStrategy() = New Serialization.CamelCaseNamingStrategy
    
    Dim JSON_s As New JsonSerializer
    JSON_s.Converters.Add(sec)
    
    Dim jsonObject As JObject
    jsonObject = JObject.FromObject(SomeObject, JSON_s)
    Dim text = jsonObject.ToString
    
    IO.File.WriteAllText(filePath, text)
    
    0 讨论(0)
  • 2020-11-22 04:00

    You can also add a converter to your JsonSerializer if you don't want to use JsonConverter attribute:

    string SerializedResponse = JsonConvert.SerializeObject(
         objToSerialize, 
         new Newtonsoft.Json.Converters.StringEnumConverter()
    ); 
    

    It will work for every enum it sees during that serialization.

    0 讨论(0)
  • 2020-11-22 04:01

    Here is the answer for newtonsoft.json

    enum Gender { Male, Female }
    
    class Person
    {
        int Age { get; set; }
    
        [JsonConverter(typeof(StringEnumConverter))]
        Gender Gender { get; set; }
    }
    
    0 讨论(0)
提交回复
热议问题