代码之家  ›  专栏  ›  技术社区  ›  ExternalUse

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

  •  0
  • ExternalUse  · 技术社区  · 6 年前

    这个问题是相关的,但我不认为

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

    现在,我的实际问题是: 我的应用程序(特别是SyncFusion组件数据源,如multisect)需要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对象与命名空间中的枚举相同(除了我为每个条目的键和值提供了一个属性名:

    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核心非常熟悉,我很难相信这是一个好的解决方案。然而,我发现很难直接找到更好的例子。

    如果您能帮助我改进这一点,并使它对将整个枚举“导出”到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 回复  |  直到 6 年前
        1
  •  1
  •   Derviş Kayımbaşıoğlu    6 年前

    您可能有静态方法,例如

    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);
    
        2
  •  1
  •   shingo    6 年前

    下面是将枚举转换为字典的Microsoft文档示例

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

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