将 JSON 字符串整数反序列化为 ASP.NET 核心中的枚举
Deserialize a JSON string integer to an Enum in ASP.NET Core
我正在创建一个 ASP.NET 核心 API 我的用户有一个角色,就像这样
class User
{
public Guid Id {get; set;}
public string Email {get; set;}
public Role Role {get; set;}
}
enum Role : byte
{
User = 0,
Administrator = 1
}
现在的问题是,我的用户 CreateOrUpdate
端点正在获取此 JSON 数据
{
"id": "2abe50d6-4c81-4ace-ad95-c8182d4384a3",
"email": "someEmail@example.org",
"role": "0"
}
这是有问题的端点声明
public User CreateOrUpdate([FromBody] User user)
{
// ...
}
它无法反序列化它,因此 returns HTTP 400 Bad Request
。但是,如果我删除 role
属性 的 0
周围的引号,它就像一个魅力。
那么,如何让 ASP.NET Core 将 "0"
反序列化为 0
,从而反序列化为枚举变体 User
?
您必须编写自己的转换器。视情况而定,如果您使用的是 Newtonsoft or Microsoft.Json.Text,则实现或多或少是相同的,但是您必须注意使用正确命名空间之外的 classes 和属性,并且不要混合使用它们。
根据您的使用情况,您可以查看 Microsoft or Newtonsoft 中 StringEnumConverter
的原始代码,并在此基础上编写您自己的代码。
在您的 class 中,您可以通过将相应的属性应用于特定属性来应用此转换器。
来自 How to customize property names and values with System.Text.Json - Enum as string.
默认情况下,System.Text.Json从整数转换枚举,但在你的情况下“0”是一个字符串。您需要指定一个转换器来将枚举从字符串转换为 :
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddJsonOptions(o =>
{
o.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
o.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
}
我正在创建一个 ASP.NET 核心 API 我的用户有一个角色,就像这样
class User
{
public Guid Id {get; set;}
public string Email {get; set;}
public Role Role {get; set;}
}
enum Role : byte
{
User = 0,
Administrator = 1
}
现在的问题是,我的用户 CreateOrUpdate
端点正在获取此 JSON 数据
{
"id": "2abe50d6-4c81-4ace-ad95-c8182d4384a3",
"email": "someEmail@example.org",
"role": "0"
}
这是有问题的端点声明
public User CreateOrUpdate([FromBody] User user)
{
// ...
}
它无法反序列化它,因此 returns HTTP 400 Bad Request
。但是,如果我删除 role
属性 的 0
周围的引号,它就像一个魅力。
那么,如何让 ASP.NET Core 将 "0"
反序列化为 0
,从而反序列化为枚举变体 User
?
您必须编写自己的转换器。视情况而定,如果您使用的是 Newtonsoft or Microsoft.Json.Text,则实现或多或少是相同的,但是您必须注意使用正确命名空间之外的 classes 和属性,并且不要混合使用它们。
根据您的使用情况,您可以查看 Microsoft or Newtonsoft 中 StringEnumConverter
的原始代码,并在此基础上编写您自己的代码。
在您的 class 中,您可以通过将相应的属性应用于特定属性来应用此转换器。
来自 How to customize property names and values with System.Text.Json - Enum as string.
默认情况下,System.Text.Json从整数转换枚举,但在你的情况下“0”是一个字符串。您需要指定一个转换器来将枚举从字符串转换为 :
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddJsonOptions(o =>
{
o.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
o.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
}