当我使用DataContractJsonSerializer序列化枚举值时,它将序列化枚举的数值,而不是字符串名称。
IE浏览器:
enum foo { bar, baz }
序列化foo.bar的值将返回“ 0”,而不是“ bar”。
我更喜欢它,是否有一种方法可以覆盖它?
编辑:
因为我不想更改序列化程序,所以我使用了一个简单的变通办法。
我在类中公开了要序列化的属性,该属性在值上调用ToString,即:
// Old [DataMember] public EnumType Foo { get { return _foo; } set { _foo = value; } } // New, I still kept the EnumType but I only serialize the string version public EnumType Foo { get { return _foo; } set { _foo = value; } } [DataMember] public string FooType { get { return _foo.ToString(); } private set {} }
看起来这是设计使然,无法更改此行为:
枚举成员值在JSON中被视为数字,这与在数据协定中将其作为成员名称包括在内的方式不同。
这是使用替代(且IMO更好且可扩展的)串行器的示例,该串行器可实现您所寻找的目标:
using System; using Newtonsoft.Json; class Program { static void Main(string[] args) { var baz = Foo.Baz; var serializer = new JsonSerializer(); serializer.Converters.Add(new JsonEnumTypeConverter()); serializer.Serialize(Console.Out, baz); Console.WriteLine(); } } enum Foo { Bar, Baz } public class JsonEnumTypeConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(Foo); } public override void WriteJson(JsonWriter writer, object value) { writer.WriteValue(((Foo)value).ToString()); } public override object ReadJson(JsonReader reader, Type objectType) { return Enum.Parse(typeof(Foo), reader.Value.ToString()); } }