背景介绍
在webapi中增加数据的时候会传递一个实体,实体中可能存在枚举类型的数据,如果传递下标值不容易方便扩展,因为下标都是顺序标定的,比如:
public enum Gender
{
man, //--0
woman // --1
}
但是在实际需求过程中可能会在man 或者woman中间加入一个新的枚举值。这个时候前台传递下标不变的情况下就会产生错误。如果让前端改动也不是一个很好的方案,这个时候需要在接口传递参数过程中添加处理。
解决方案
展示的时候需要将枚举类型展示成为定义的样式,解决方案为在枚举类型定义上边添加特性[Newtonsoft.Json.JsonConverter(typeof(StringEnumConverter))]就可以了。 添加上述特性之后后台向前台展示问题解决了,但是新问题就是前端向后台传递数据的时候如果是按照字符串传递枚举类型会报错。在.netcore startup添加中间件就可以处理 services.AddControllers().AddNewtonsoftJson(); 经过这两个步骤就可以将枚举数据类型的问题解决了。东西不多,但是在探索过程中经历了各种挫折,现在有时间赶紧记录下来方便以后查阅。
步骤记录
1、如果不作处理,后端传递给前段的数据为:
2、想要的结果为:
在这里需要在定义枚举的变量上添加特性
展示正确,然后前台需要传递给后台
然后就出现了错误:
这个问题的原因是因为在startup中没有添加相关的中间件,需要在startup中的AddController后链式添加json处理
所有的依赖项添加完成之后如下图
正确显示结果:
代码如下
[Newtonsoft.Json.JsonConverter(typeof(StringEnumConverter))]
public enum Gender
{
man, //--0
woman // --1
}
public class Demo
{
public string Name { get; set; }
public Gender Gender { get; set; }
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddNewtonsoftJson();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "EnumDataRecord", Version = "v1" });
});
}
[HttpPost]
public IActionResult PostEnumData(Demo demo)
{
return Ok("");
}
[HttpGet]
public IActionResult GetEnumJson()
{
List<Demo> demoList = new List<Demo>();
Demo demo = new Demo();
demo.Name = "张三";
demo.Gender = Gender.man;
demoList.Add(demo);
Demo demo1 = new Demo();
demo1.Name = "李四";
demo1.Gender = Gender.woman;
demoList.Add(demo1);
string jsonString = JsonConvert.SerializeObject(demoList);
return Ok(jsonString);
}
``