You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core中如何将枚举返回为字符串值而非数字

EF Core 3.1 枚举返回客户端显示字符串而非数字的解决方法

你已经通过HasConversion()让EF Core将枚举以字符串存入数据库,但返回给客户端时仍显示数字,这是因为JSON序列化默认会把枚举序列化为其数值。以下几种方法可以解决这个问题:

1. 全局配置JSON序列化

根据你项目使用的JSON序列化库,选择对应配置:

若使用Newtonsoft.Json(Json.NET)

在Startup.cs的ConfigureServices中配置:

services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
    });

若使用System.Text.Json

在Startup.cs的ConfigureServices中配置:

services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
    });

2. 针对单个属性配置序列化特性

如果不想全局修改,可直接在枚举属性上添加序列化特性:

用Newtonsoft.Json特性

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

public class User
{
    // 其他属性省略
    public string Name { get; set; }
    
    [JsonConverter(typeof(StringEnumConverter))]
    public UserStatus Status { get; set; }
}

用System.Text.Json特性

using System.Text.Json.Serialization;

public class User
{
    // 其他属性省略
    public string Name { get; set; }
    
    [JsonConverter(typeof(JsonStringEnumConverter))]
    public UserStatus Status { get; set; }
}

3. 使用数据传输对象(DTO)

创建单独的DTO类,将枚举转换为字符串后返回给客户端,避免直接暴露实体模型:

public class UserDto
{
    public string Name { get; set; }
    public string Status { get; set; }

    // 从实体转换到DTO
    public static UserDto FromUser(User user)
    {
        return new UserDto
        {
            Name = user.Name,
            Status = user.Status.ToString()
        };
    }
}

在接口中返回UserDto而非User:

[HttpGet("{id}")]
public IActionResult GetUser(int id)
{
    var user = _context.Users.Find(id);
    if (user == null) return NotFound();
    return Ok(UserDto.FromUser(user));
}

内容的提问来源于stack exchange,提问作者Răzvan Puștea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:52:33