【问题标题】:How to serialize enum as string when the enum type is used in a generic class?在泛型类中使用枚举类型时如何将枚举序列化为字符串?
【发布时间】:2017-02-03 19:27:24
【问题描述】:

在一个自定义类中,我有一个通用字典,它有一个枚举类型作为值类型。请注意,枚举类型不在我的控制范围内(属于第 3 方程序集)。

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

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

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

这是一个复制样本:

输出:

{"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
    }
}

【问题讨论】:

  • @PatrickHofman,我不同意。有关更改字典功能的链接问题,具体的键。这种情况只需要添加一个JsonConverter,这几乎没有那么激烈。见dotnetfiddle.net/c6JlZl
  • 对于您的问题,您可以编写自定义 JsonConverter。你可以在这里看到很好的例子:stackoverflow.com/questions/21908262/…
  • 你可以使用:var json = JsonConvert.SerializeObject(data, new StringEnumConverter());
  • @PatrickHofman:你说得对,这是重复的(找不到)。而且我想副本中接受的答案将解决我的问题。谢谢
  • 如果它不是 stackoverflow.com/questions/2441290/… 的重复,人们可能会争论。

标签: c# json.net


【解决方案1】:

你可以试试这个

var data = new Data();

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

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

【讨论】:

    猜你喜欢
    • 2014-07-23
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多