这是我输入的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对象包含在一个权限项目列表中,其中每个权限项目本身又具有一个权限动作列表。
答案 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; }
}