【问题标题】:Deserialize a JSON string integer to an Enum in ASP.NET Core在 ASP.NET Core 中将 JSON 字符串整数反序列化为枚举
【发布时间】:2025-11-26 00:35:01
【问题描述】:

我正在创建一个 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。但是,如果我删除 role 属性的 0 周围的引号,它就像一个魅力。

那么,如何让 ASP.NET Core 将 "0" 反序列化为 0 以及枚举变体 User

【问题讨论】:

    标签: c# json asp.net-core system.text.json


    【解决方案1】:

    来自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());
        });
    }
    

    【讨论】:

      【解决方案2】:

      您必须编写自己的转换器。视情况而定,如果您使用 NewtonsoftMicrosoft.Json.Text,实现或多或少是相同的,但您必须注意使用正确命名空间之外的类和属性,不要混合使用它们。

      根据您的使用情况,您可以在MicrosoftNewtonsoft 查看StringEnumConverter 的原始代码,并在此基础上编写自己的代码。

      然后,您可以在您的课程中通过使用相应属性来将此转换器应用于特定属性。

      【讨论】: