【问题标题】:Serialize C# Enum Definition to Json将 C# 枚举定义序列化为 Json
【发布时间】:2013-01-24 10:21:51
【问题描述】:

在 C# 中给出以下内容:

[Flags]
public enum MyFlags {
  None = 0,
  First = 1 << 0,
  Second = 1 << 1,
  Third = 1 << 2,
  Fourth = 1 << 3
}  

ServiceStack.Text 中是否有任何现有方法可以序列化为以下 JSON?

{
  "MyFlags": {
    "None": 0,
    "First": 1,
    "Second": 2,
    "Third": 4,
    "Fourth": 8
  }
}

目前我正在使用下面的例程,有没有更好的方法来做到这一点?

public static string ToJson(this Type type)
    {
        var stringBuilder = new StringBuilder();
        Array values = Enum.GetValues(type);
        stringBuilder.Append(string.Format(@"{{ ""{0}"": {{", type.Name));

        foreach (Enum value in values)
        {
            stringBuilder.Append(
                string.Format(
                    @"""{0}"": {1},", 
                    Enum.GetName(typeof(Highlights), value), 
                    Convert.ChangeType(value, value.GetTypeCode())));
        }

        stringBuilder.Remove(stringBuilder.Length - 1, 1);
        stringBuilder.Append("}}");
        return stringBuilder.ToString();
    }

【问题讨论】:

  • +1,不错的代码。顺便说一句:s/typeof(Highlights)/type/g
  • @GavinFaux 枚举不是集合。枚举就像具有常量的类,因此我不认为将它们序列化为对象或关联数组是“合法的”。
  • @ElYusubov:我不同意,所需的输出与链接问题中的输出完全不同。

标签: c# json serialization enums servicestack


【解决方案1】:
public static class EnumExtensions
{
    public static string EnumToJson(this Type type)
    {
        if (!type.IsEnum)
            throw new InvalidOperationException("enum expected");

        var results =
            Enum.GetValues(type).Cast<object>()
                .ToDictionary(enumValue => enumValue.ToString(), enumValue => (int) enumValue);


        return string.Format("{{ \"{0}\" : {1} }}", type.Name, Newtonsoft.Json.JsonConvert.SerializeObject(results));

    }
}

使用字典来完成繁重的工作。然后使用 Newtonsoft 的 json convert 将其转换为 json。我只需要做一些包装来添加类型名称。

【讨论】:

  • 我正在做类似的事情,但你打败了我。一项修改:您可以使用内置的JavaScriptSerializer 而不是外部库。例如,请参阅here
【解决方案2】:

最好填充 Dictionary&lt;string,int&gt; 或 Typed DTO 并对其进行序列化。

【讨论】:

  • 谢谢,我最初确实尝试过查找值,但遇到了一些问题,将再看看。
  • 抱歉重复了,我想看看ServiceStack中是否已经有任何东西,即:Enum.GetValues(typeof(MyEnum)).OfType().Where(x = > x != MyEnum.None).ToDictionary(k => k.ToString(), v => (int)v)
猜你喜欢
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2018-10-11
  • 2015-11-11
相关资源
最近更新 更多