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

时间:2018-08-01 09:21:44

标签: c# class dto

这是我输入的JSON响应

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

我正在尝试为它创建DTO类。到目前为止,我已经创建了一组具有可用值的Enum

PermissionAction枚举

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

PermissionItem枚举

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使其他人感到困惑。抱歉让您感到困惑。实际上,我的权限JSON对象包含在一个权限项目列表中,其中每个权限项目本身又具有一个权限动作列表。

2 个答案:

答案 0 :(得分:0)

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

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

最终,您需要自定义反序列化,以使作为 array 出现的 flags 变为逗号分隔的大写标志字符串。

也就是说,您将结束此类:

public class Permissions
{
    public Permissions(A a, B b) 
    {
        A = a;
        B = b;
    }

    public A A { get; }
    public B B { get; }
}

答案 1 :(得分:0)

您可以使用从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; }
}