DataContractJsonSerializer和枚举

DataContractJsonSerializer和枚举

当我使用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());
    }
}

参考更多解答:DataContractJsonSerializer和枚举,转载请保留DataContractJsonSerializer和枚举

更多:json