Min*_*ipe 5 c# json asp.net-core system.text.json
我正在创建一个 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
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,我的用户CreateOrUpdate
端点正在获取此 JSON 数据
{
"id": "2abe50d6-4c81-4ace-ad95-c8182d4384a3",
"email": "someEmail@example.org",
"role": "0"
}
Run Code Online (Sandbox Code Playgroud)
这是有问题的端点声明
public User CreateOrUpdate([FromBody] User user)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
它无法反序列化,因此返回HTTP 400 Bad Request
. 但是,如果我删除周围的引号0
中的role
属性,它就像一个魅力。
那么,如何才能获得ASP.NET核心反序列化"0"
的0
,因此,以枚举变种User
?
您必须编写自己的转换器。根据情况,如果您使用Newtonsoft或Microsoft.Json.Text,实现或多或少是相同的,但您必须注意使用正确命名空间之外的类和属性,并且不要混合它们。
根据您的使用情况,您可以查看 Microsoft 或 Newtonsoft 的原始代码StringEnumConverter
,并基于此编写您自己的代码。
然后,在您的类中,您可以通过使用特定属性的相应属性来应用此转换器。
从如何使用 System.Text.Json-Enum 作为 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());
});
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
569 次 |
最近记录: |