2016-09-26 85 views
0

在自定义类中,我有一个通用字典,它具有值类型的枚举类型。请注意,枚举类型不在我的控制之下(第三方程序集的一部分)。如何在泛型类中使用枚举类型时将枚举序列化为字符串?

当我使用Newtonsoft序列化这样的对象时,枚举被写为整数。

如何将枚举序列化为字符串?

我已经尝试在属性上使用StringEnumConverter,但它仅适用于属性本身,而不适用于使用泛型。由于枚举是在外部程序集中声明的,因此我无法直接在枚举上应用StringEnumConverter。

这里是一个REPRO样品:

输出:

{"ExtendedData":{"First":0,"Second":1}}

代码

using System; 
using System.Collections.Generic; 

using Newtonsoft.Json; 
using Newtonsoft.Json.Converters; 

public class Program 
{ 
    public static void Main() 
    { 
     var data = new Data(); 

     data.ExtendedData.Add("First", Foo.Val1); 
     data.ExtendedData.Add("Second", Foo.Val2); 

     Console.WriteLine(JsonConvert.SerializeObject(data)); 
    } 

    public class Data{ 
     private readonly Dictionary<string, Foo> m_ExtendedData = new Dictionary<string, Foo>(); 

     public Dictionary<string, Foo> ExtendedData {get { return m_ExtendedData ; }} 
    } 

// !Actually from an external assembly 
    public enum Foo{ 
     Val1, 
     Val2 
    } 
} 
+0

@PatrickHofman,我不同意。关于更改字典功能的链接问题,关键要具体。这种情况只需要添加一个'JsonConverter',这几乎不会太激烈。请参阅https://dotnetfiddle.net/c6JlZl – kiziu

+0

对于您的问题,您可以编写自定义JsonConverter。很好的例子,你可以在这里看到:http://stackoverflow.com/questions/21908262/newtonsoft-json-deserializeobject-emtpy-guid-field – eocron

+2

你可以使用: var json = JsonConvert.SerializeObject(data,new StringEnumConverter()) ; –

回答

1

你可以试试这个

var data = new Data(); 

data.ExtendedData.Add("First", Foo.Val1); 
data.ExtendedData.Add("Second", Foo.Val2); 

var json = JsonConvert.SerializeObject(data, new StringEnumConverter()); 
+0

非常简单 - 但工作 - 解决方案。谢谢 –