首页 > 解决方案 > 将枚举值和名称序列化为 JSON

问题描述

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

在测试时,我还偶然发现了这个让我的生活变得困难的罪魁祸首 LinqPad: 为什么 LINQPad 将枚举整数值转储为字符串?

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

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

更新 正如 dbc 指出的那样,我的问题可能还不够清楚。我不想序列化枚举的一个条目,而是整个结构。然后 JSON 可以用于 Javascript 中的数据源,例如,简化: <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 等)并没有产生数组中的所有选项,所以我最终使用了 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(从 GAC 导入 Newtonsoft.Json):

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 
};

标签: c#jsonenums

解决方案


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

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

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


推荐阅读