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
相关产品推荐
相关产品推荐

