将枚举列表定义为 DTO Class C#
Defining List of Enum as DTO Class C#
这是我的输入JSON响应
{
"permissions": {
"user": [
"Add",
"Update",
"Delete"
],
"Product": [
"Read",
"Create"
]
}
}
我正在尝试为此创建 DTO class。到目前为止,我已经创建了一组具有可用值的枚举
PermissionAction 枚举
public enum PermissionAction
{
Add,
Update,
Read,
Delete,
Create
}
PermissionItem 枚举
public enum PermissionItem
{
User,
Product
}
如何使用可用的枚举为给定的 JSON 响应创建 DTO Class?
我累得不一样
public class Permissions
{
public List<PermissionAction> User { get; set; }
public List<PermissionItem> Product { get; set; }
}
这是错误的。
因为响应可能会动态变化。我的意思是有时 User
列表不可用,有时 Product
不可用。
喜欢,
{
"permissions": {
"user": [
"Add",
"Update",
"Delete"
]
}
}
我的 DTO 也需要支持这些类型的响应 Class。
更新 1:
我认为我在上面发布的 JSON 让其他人感到困惑。很抱歉造成混乱。实际上,我的权限 JSON 对象包含在权限项列表中,其中每个权限项本身又具有权限操作列表。
您似乎需要使用二进制或(即 |
)自定义序列化。
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!
}
毫无疑问,您需要自定义反序列化,以便 flags 作为 arrays 变成逗号分隔的大写标志字符串。
也就是说,你最终会得到这个 class:
public class Permissions
{
public Permissions(A a, B b)
{
A = a;
B = b;
}
public A A { get; }
public B B { get; }
}
您可以使用从 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; }
}
这是我的输入JSON响应
{
"permissions": {
"user": [
"Add",
"Update",
"Delete"
],
"Product": [
"Read",
"Create"
]
}
}
我正在尝试为此创建 DTO class。到目前为止,我已经创建了一组具有可用值的枚举
PermissionAction 枚举
public enum PermissionAction
{
Add,
Update,
Read,
Delete,
Create
}
PermissionItem 枚举
public enum PermissionItem
{
User,
Product
}
如何使用可用的枚举为给定的 JSON 响应创建 DTO Class?
我累得不一样
public class Permissions
{
public List<PermissionAction> User { get; set; }
public List<PermissionItem> Product { get; set; }
}
这是错误的。
因为响应可能会动态变化。我的意思是有时 User
列表不可用,有时 Product
不可用。
喜欢,
{
"permissions": {
"user": [
"Add",
"Update",
"Delete"
]
}
}
我的 DTO 也需要支持这些类型的响应 Class。
更新 1:
我认为我在上面发布的 JSON 让其他人感到困惑。很抱歉造成混乱。实际上,我的权限 JSON 对象包含在权限项列表中,其中每个权限项本身又具有权限操作列表。
您似乎需要使用二进制或(即 |
)自定义序列化。
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!
}
毫无疑问,您需要自定义反序列化,以便 flags 作为 arrays 变成逗号分隔的大写标志字符串。
也就是说,你最终会得到这个 class:
public class Permissions
{
public Permissions(A a, B b)
{
A = a;
B = b;
}
public A A { get; }
public B B { get; }
}
您可以使用从 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; }
}