如何解决在 ASP.NET Core 中将 JSON 字符串整数反序列化为 Enum
我正在创建一个 ASP.NET Core 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)
{
// ...
}
它无法反序列化,因此返回 HTTP 400 Bad Request
。但是,如果我删除 0
属性的 role
周围的引号,它就像一个魅力。
那么,如何让 ASP.NET Core 将 "0"
反序列化为 0
,从而反序列化为枚举变体 User
?
解决方法
来自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());
});
}
,
您必须编写自己的转换器。视情况而定,如果您使用 Newtonsoft 或 Microsoft.Json.Text,实现或多或少相同,但您必须注意使用正确命名空间之外的类和属性,不要混合使用它们.
根据您的使用情况,您可以在 Microsoft 或 Newtonsoft 处查看 StringEnumConverter
的原始代码,然后在此基础上编写自己的代码。
在您的类中,您可以通过将相应的属性用于特定属性来应用此转换器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。