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

将枚举列表定义为C类的DTO#

  •  1
  • Jayendran  · 技术社区  · 6 年前

    这是我的输入JSON响应

    {
       "permissions": {
                "user": [
                    "Add",
                    "Update",
                    "Delete"
                ],
                "Product": [
                    "Read",
                    "Create"
                ]
            }
    }
    

    我正试图为其创建DTO类。到目前为止,我已经创建了一组具有可用值的枚举

    权限操作枚举

     public enum PermissionAction
        {
            Add,
            Update,
            Read,
            Delete,
            Create
        }
    

    权限项枚举

    public enum PermissionItem
    {
        User,
        Product
    }
    

    如何使用可用的枚举为给定的JSON响应创建DTO类?

    我累得不一样

    public class Permissions
    {
    
        public List<PermissionAction> User { get; set; }
    
        public List<PermissionItem> Product { get; set; }
    }
    

    这是错误的。

    因为响应可能是动态变化的。我的意思是有时候 User 列表将不可用,有时 Product 不可用。

    就像,

    {
       "permissions": {
                "user": [
                    "Add",
                    "Update",
                    "Delete"
                ]
          }
    }
    

    我还需要在DTO类中支持这些类型的响应。

    更新1:

    我认为我在上面发布的JSON让其他人感到困惑。很抱歉让你这么困惑。实际上,my permissions JSON对象包含一个权限项列表,其中每个权限项本身都有一个权限操作列表。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Matías Fidemraizer    6 年前

    似乎需要使用二进制或(即。 | )自定义序列化。

    Enum 已经可以分析许多名称:

    [Flags] // <--- Don't forget to apply this attribute if you want masks!
    public enum A { X, Y }
    
    Enum.TryParse<A>("X, Y", out var flags);
    
    if(flags.HasFlag(A.X) && flags.HasFlag(A.Y))
    {
        // It'll enter here!
    }
    

    最后,您需要自定义反序列化,以便 旗帜 作为 数组 转换为逗号分隔的大写标志字符串。

    也就是说,你最终会上这门课:

    public class Permissions
    {
        public Permissions(A a, B b) 
        {
            A = a;
            B = b;
        }
    
        public A A { get; }
        public B B { get; }
    }
    
        2
  •  0
  •   Cetin Basoz    6 年前

    您可以使用从NuGet获得的Newtosoft.Json完成此操作:

    void Main()
    {
        string json = @"{
       ""permissions"": {
                ""user"": [
                    ""Add"",
                    ""Update"",
                    ""Delete""
                ],
                ""Product"": [
                    ""Read"",
                    ""Create""
                ]
            }
    }";
    
        var root = Root.FromJson(json);
    
        Console.WriteLine("C# Object");
        Console.WriteLine("Permissions:");
        Console.WriteLine("\tUser:[");
        foreach (var v in root.Permissions.User)
        {
            Console.WriteLine($"\t\t{v}");
        }
        Console.WriteLine("\t]");
        Console.WriteLine("\tProduct:[");
        foreach (var v in root.Permissions.Product)
        {
            Console.WriteLine($"\t\t{v}");
        }
        Console.WriteLine("\t]");
    
    
        Console.WriteLine("As JSON string");
        Console.WriteLine(root.ToJson());
    }
    
    [JsonConverter(typeof(StringEnumConverter))]
    public enum UserAction { 
        Add,
        Update,
        Delete
    }
    
    [JsonConverter(typeof(StringEnumConverter))]
    public enum ProductAction
    {
        Read,
        Create
    }
    
    public partial class Root
    {
        [JsonProperty("permissions")]
        public Permissions Permissions { get; set; }
    
        public static Root FromJson(string json) => JsonConvert.DeserializeObject<Root>(json);
        public string ToJson() => JsonConvert.SerializeObject(this);
    }
    
    public class Permissions
    {
        [JsonProperty("user")]
        public List<UserAction> User { get; set ; }
    
        [JsonProperty("Product")]
        public List<ProductAction> Product { get; set; }
    }