前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >.Net之API响应值中枚举处理

.Net之API响应值中枚举处理

作者头像
郑子铭
发布2025-02-18 13:57:29
发布2025-02-18 13:57:29
7100
代码可运行
举报
运行总次数:0
代码可运行

前言

最近在迁移一个老项目的接口到另一个新项目中,为了前端同事最小修改,所以响应的格式等最好保持不变,然后在使用中发现了老项目中如果遇到返回值的内容包含枚举,就将其转为枚举字符串内容进行返回,然后就出现了下面的修改。

创建伪代码

新建一个.Net8 Api项目,然后增加一个枚举

代码语言:javascript
代码运行次数:0
复制
public enum SexInfo
{
    None,
    Man,
    Woman
}

修改默认的控制器WeatherForecastController的Get方法返回值增加

代码语言:javascript
代码运行次数:0
复制
public class WeatherForecast
{
public DateOnly Date{get;set;}

public int TemperatureC{get;set;}

public int TemperatureF=>32+(int)(TemperatureC/0.5556);

public string? Summary{get;set;}

public SexInfo Sex{get;set;}// 👈
}

然后在Api的方法中默认写死一个性别返回值

代码语言:javascript
代码运行次数:0
复制
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1,5).Select(index =>newWeatherForecast
{
Date=DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Sex=SexInfo.Man,// 👈
TemperatureC=Random.Shared.Next(-20,55),
Summary=Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}

懒省事方案

本来以为就是这一个接口需要这么处理,那么我就随便堆一下吧,只需要修改返回类

代码语言:javascript
代码运行次数:0
复制
using Newtonsoft.Json;

public class WeatherForecast
{
public DateOnly Date{get;set;}

public int TemperatureC{get;set;}

public int TemperatureF=>32+(int)(TemperatureC/0.5556);

public string? Summary{get;set;}

[JsonIgnore]
public SexInfo Sex{get;set;}

[JsonProperty("sex")]
public string SexStr=>Sex.ToString();// 👈
}

其他不需要改动,然后查看返回值

代码语言:javascript
代码运行次数:0
复制
[
  {
"date":"2024-12-22",
"temperatureC":-8,
"temperatureF":18,
"summary":"Warm",
"sex":"Man"
},
{
"date":"2024-12-23",
"temperatureC":49,
"temperatureF":120,
"summary":"Scorching",
"sex":"Man"
}

...
]

这个效果就是满足需求的,那么就暂且这么搞吧。

同事优化方案

同事在写其他接口的时候也遇到了这个情况,然后他并没有这么做,这个项目是已经引用了Microsoft.AspNetCore.Mvc.NewtonsoftJson包(替代默认的序列化包使用NewtonsoftJson进行处理),且已经配置了下面代码

代码语言:javascript
代码运行次数:0
复制
builder.Services.AddControllers()
    .AddNewtonsoftJson(); // 👈

我将他修改的伪代码返回值类放出来

代码语言:javascript
代码运行次数:0
复制
using Newtonsoft.Json.Converters;
using System.Text.Json.Serialization;

namespace WebApplication1;

public class WeatherForecast
{
   public DateOnly Date{get;set;}

   public int TemperatureC{get;set;}

   public int TemperatureF=>32+(int)(TemperatureC/0.5556);

   public string? Summary{get;set;}

   [JsonConverter(typeof(StringEnumConverter))]// 👈
   public SexInfo Sex{get;set;}

}

public enum SexInfo
{
None,
Man,
Woman
}

同样只是返回类做了处理,API方法里面并没有做特殊处理,但是前端反馈有问题,没有返回的枚举字符串???

代码语言:javascript
代码运行次数:0
复制
[
  {
"date":"2024-12-22",
"temperatureC":-16,
"temperatureF":4,
"summary":"Sweltering",
"sex":1
},
{
"date":"2024-12-23",
"temperatureC":6,
"temperatureF":42,
"summary":"Sweltering",
"sex":1
  },

这个就很奇怪了,因为我对这个返回值中枚举做序列化操作StringEnumConverter不熟练,那么只好去搜一下了,看到有人说,你应该在AddNewtonsoftJson中进行配置一下

代码语言:javascript
代码运行次数:0
复制
builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.Converters.Add(new StringEnumConverter());
    });

我将配置修改成这个样子后,发现返回了枚举的字符串后,虽然略有疑惑,但是还是果断提交了代码,此刻我理解的逻辑是,需要下面两个东西都配置才能实现枚举转枚举字符串

代码语言:javascript
代码运行次数:0
复制
1、属性标注StringEnumConverter
2、options.SerializerSettings.Converters.Add(new StringEnumConverter());

引起了其他问题

前端反馈该项目的其他部分接口本来枚举应该返回枚举值的,现在也返回枚举字符串了,我???其他模型我记得是没有做特殊操作的,难得共用了模型类吗?结果是没有的,那么就应该再检查下哪里有点不对劲呀?在Program.cs中AddNewtonsoftJson应该是全局配置的意思,应该是这个导致的,那么为啥我针对单个模型设置不生效那?返回过去一检查,竟然是这么回事

代码语言:javascript
代码运行次数:0
复制
using Newtonsoft.Json;// 正确的
using Newtonsoft.Json.Converters;
//using System.Text.Json.Serialization; // 错误的

namespaceWebApplication1;

publicclassWeatherForecast
{
public DateOnly Date{get;set;}

public int TemperatureC{get;set;}

public int TemperatureF=>32+(int)(TemperatureC/0.5556);

public string? Summary{get;set;}

[JsonConverter(typeof(StringEnumConverter))]
public SexInfo Sex{get;set;}

}

public enum SexInfo
{
None,
Man,
Woman
}

这个时候还原下面代码

代码语言:javascript
代码运行次数:0
复制
builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        //options.SerializerSettings.Converters.Add(new StringEnumConverter());
    });

这样子就可以实现,如果接口中的返回值的枚举想返回枚举字符串就特殊处理,不需要的就不处理,默认返回枚举值了(当然还是更建议统一下返回值)

总结

如果使用NewtonsoftJson替换了默认的序列化包方案,那么在使用其特性的时候还得注意,别引用错命令空间了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 创建伪代码
  • 懒省事方案
  • 同事优化方案
  • 引起了其他问题
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档