【问题标题】:Serialize Enum Values and Names to JSON将枚举值和名称序列化为 JSON
【发布时间】:2019-01-13 00:43:06
【问题描述】:

这个问题是相关的,但恕我直言,与

在测试时,我还偶然发现了这个让我的生活变得困难的罪魁祸首 LinqPad: Why does LINQPad dump enum integer values as strings?

现在,我的实际问题: 我的应用程序(特别是 SyncFusion 组件数据源,例如 MultiSelect)需要 JSON 格式的枚举,例如像这样:

[ {"Id":0,"Name":"Unknown"},{"Id":1,"Name":"Open"},{"Id":2,"Name":"Closed"},{"Id":3,"Name":"Approve"} ]

更新 正如 dbc 指出的那样,我的问题可能还不够清楚。我不想序列化枚举的一个条目,而是整个结构。 JSON 然后可以用于 Javascript 中的数据源,例如对于 a ,简化: <option value=0>Unknown</option> <option value=1>Open</option> etc

JSON 对象与命名空间中的 Enum 相同(除了我为每个条目的 Key 和 Value 赋予了属性名称:

public enum ListOptions
{
    Unknown = 0,
    Open = 1,
    Closed = 2,
    Approve = 3
}

我一直在努力使用枚举,所有其他方法(例如指定 Json StringConverter 等)都没有在数组中产生 all 选项,所以我最终使用了 Linq。我的视图模型现在有一个这样的字符串属性:

public string CrewListOption => JsonConvert.SerializeObject(Enum.GetValues(typeof(ListOptions))
        .Cast<int>()
        .Select(e => new { Id = (int)  e, Name = typeof(ListOptions).GetEnumName(e) }));

鉴于我几乎是 ASP.Net Core 的初学者,我很难相信这应该是一个好的解决方案。然而,我发现很难找到同一件事的直接更好的例子。

如果您能帮助我改进这一点,我将不胜感激,并使其在将整个枚举“导出”到 JSON 时可能更普遍有用。

这是完整的 LinqPad(Newtonsoft.Json 是从 GAC 导入的):

void Main()
{   
    Enum.GetValues(typeof(ListOptions)).Cast<int>().Select(e => new { Id = e, Name = (ListOptions) e } ).Dump(); // these are identical, except for the typeof()
    Enum.GetValues(typeof(ListOptions)).Cast<int>().Select(e => new { Id = (int)  e, Name = typeof(ListOptions).GetEnumName(e) }).Dump(); // is typeof(MyEnumType) better?
    string JsonString = JsonConvert.SerializeObject(Enum.GetValues(typeof(ListOptions)).Cast<int>().Select(e => new { Id = (int)  e, Name = typeof(ListOptions).GetEnumName(e) }));
    JsonString.Dump(); // [{"Id":0,"Name":"Unknown"},{"Id":1,"Name":"Open"},{"Id":2,"Name":"Closed"},{"Id":3,"Name":"Approve"}]
}

public enum ListOptions { 
    Unknown = 0,
    Open = 1,
    Closed = 2,
    Approve = 3 
};

【问题讨论】:

  • 我不确定我是否理解您的问题。既然您使用的是json.net,那么使用StringEnumConverter 就足够了,如this answer.NET - JSON serialization of enum as string 所示?如果没有,您能否包含一个minimal reproducible example,显示您要序列化的数据模型和所需的 JSON?
  • 嗨@dbc,我希望我做到了; StringEnumConverter 只会转换一个条目,而不是整个枚举。我会重新审视我的问题并尝试改进它。

标签: c# json enums


【解决方案1】:

你可能有像这样的静态方法

public static EnumToDictionary<string, string> EnumToDictionary<T>() where T: Enum
{
    var res = Enum.GetValues(typeof(T)).Cast<T>()
        .ToDictionary(e => Convert.ToInt32(e).ToString(), e => e.ToString());

    return res;
}

然后作为对象序列化

var enumValues=  EnumToDictionary<ListOptions>();
var result = JsonConvert.SerializeObject(enumValues);

用于序列化为数组

var enumValues=  EnumToDictionary<ListOptions>().ToArray();
var result = JsonConvert.SerializeObject(enumValues);

【讨论】:

  • 我会尽快尝试,然后再接受或评论。需要一点时间来比较和分析。谢谢!
  • where T: Enum 需要 C#7.3;刚刚发现我的 VS 设置为“最新的主要版本”并且不喜欢那个约束。还发现我需要using static ....Extensions.Enum.EnumExtensions; 来缩短通话时间,不得不稍微搜索一下,直到我可以使用该方法。我已将其改回 Dictionary 但除此之外它似乎可以工作。谢谢!
【解决方案2】:

这是 Microsoft Docs 中将 Enum 转换为 Dictionary 的示例

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters#enum-constraints

然后你可以将字典序列化为 JSON。

【讨论】:

    猜你喜欢
    • 2014-08-20
    • 1970-01-01
    • 2021-12-28
    • 2016-10-16
    • 1970-01-01
    • 2013-01-24
    • 2013-09-04
    • 1970-01-01
    • 2018-10-11
    相关资源
    最近更新 更多