参考资料:
asp.net core 3.1 MVC/WebApi JSON 全局配置:
0. 照例吐槽
因为懒,我已经很久没有写过新项目了。记得好像以前 ASP.NET Core 3.1 时代,引入 Newtonsoft.Json 包,就可以直接在 Startup.cs 的 ConfigureServices 方法中 AddNewtonsoftJson 来用它序列化 Web API 的返回值。
最近想学一点前端,写点 MVC ,但即使 MVC ,有时候也要在前端用ajax等来调用后端的接口取一些值,也就是说 MVC 的 Controller 中有时候也要返回 Json 格式的数据。
今天建了个 ASP.NET Core 5.0 的新项目,引入 Newtonsoft.Json:
然后在 ConfigureServices 中 Add 一下:
发现Add不进去,没有这个方法。
1. 引入包
在 nuget.org 上检索时,我发现了这么一个包:
包名里还带个 MVC ,10天之前刚更新过,显然这个包就是给 MVC 的项目用的。引入进去。这里我引入的是 5.0 的版本,因为我创建的项目是 ASP.NET Core 5.0 的:
然后这里就有了:
2. 尝试使用
上面 Add 完之后,Newtonsoft.Json 就接管了内置的库,来为我们序列化返回值了。我们写一个接口尝试一下:
用 Postman 请求一下:
可以看到,即使我们返回的对象的属性,如Name
、Age
,都是大写字母开头,NewtonsoftJson 也帮我们默认转换成了更加规范通用的驼峰式命名方法。目前唯一的缺点就是时间类型是中间带个T
字母的格式。
最近我在工作中,跟我对接的一个IOS开发人员跑路了,因为钱给的很低,暂时没招到新人,就由他的领导来接手代码。他的领导虽然只放下了代码几个月,但水平已经下降得非常厉害(可能本来就很菜),他绞尽脑汁没办法处理中间代个T
字母的时间格式,我没搞过IOS开发,我也不知道他为什么处理不了。只能对在他接手的这段时间里新增的几个接口做特殊处理。我在想以后的项目最好是全局处理成常规的时间格式,这样就需要一些全局的配置:
3. 全局配置(时间格式,忽略null,忽略循环引用)
即使 NewtonsoftJson 默认帮我们做了很多更通用的序列化配置,我们还是要掌握一些基本的配置方法。本篇博客最上面的参考资料链接的那篇文章中,给出了官方库 System.Text.Json 和 Newtonsoft.Json 较多常用的配置方法:
上面给出了我们需要的时间格式处理,忽略空值等,我们应用在项目里:
services.AddControllersWithViews()
.AddNewtonsoftJson(options => {
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; // 设置时间格式
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // 忽略循环引用
//options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); // 数据格式首字母小写
//options.SerializerSettings.ContractResolver = new DefaultContractResolver(); // 数据格式按原样输出
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; // 忽略空值
});
再次调用接口,发现时间的格式变了:
我们再看一下空值的处理,我们不给一个 string 类型的参数赋值,则该参数默认为 null :
再次调用接口:
发现 Continent 已经被忽略了。
4. 其它
Microsoft.AspNetCore.Mvc.NewtonsoftJson 这个包肯定是依赖了 Newtonsoft.Json :
所以我们应该不必另外引入 Newtonsoft.Json 了。把这个包 Remove 掉,restore 一下,然后可以发现 Newtonsoft.Json 的功能依然可以使用: