将枚举值和名称序列化为JSON

时间:2019-01-13 00:43:07

标签: c# json enums

这个问题是相关的,但是恕我直言并不相同

在进行测试时,我还偶然发现了这个罪魁祸首的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中的数据源,例如对于,简化为: <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
}

我一直在努力使用Enums,其他所有方法(例如指定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 
};

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

这是来自Microsoft Docs的示例,该示例将Enum转换为Dictionary

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

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