ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

参考资料:

asp.net core 3.1 MVC/WebApi JSON 全局配置:

https://cloud.tencent.com/developer/article/1597403

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:

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

然后在 ConfigureServices 中 Add 一下:

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

发现Add不进去,没有这个方法。

1. 引入包

在 nuget.org 上检索时,我发现了这么一个包:

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

包名里还带个 MVC ,10天之前刚更新过,显然这个包就是给 MVC 的项目用的。引入进去。这里我引入的是 5.0 的版本,因为我创建的项目是 ASP.NET Core 5.0 的:

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

然后这里就有了:

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

2. 尝试使用

上面 Add 完之后,Newtonsoft.Json 就接管了内置的库,来为我们序列化返回值了。我们写一个接口尝试一下:

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

用 Postman 请求一下:

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

可以看到,即使我们返回的对象的属性,如NameAge,都是大写字母开头,NewtonsoftJson 也帮我们默认转换成了更加规范通用的驼峰式命名方法。目前唯一的缺点就是时间类型是中间带个T字母的格式。

最近我在工作中,跟我对接的一个IOS开发人员跑路了,因为钱给的很低,暂时没招到新人,就由他的领导来接手代码。他的领导虽然只放下了代码几个月,但水平已经下降得非常厉害(可能本来就很菜),他绞尽脑汁没办法处理中间代个T字母的时间格式,我没搞过IOS开发,我也不知道他为什么处理不了。只能对在他接手的这段时间里新增的几个接口做特殊处理。我在想以后的项目最好是全局处理成常规的时间格式,这样就需要一些全局的配置:

3. 全局配置(时间格式,忽略null,忽略循环引用)

即使 NewtonsoftJson 默认帮我们做了很多更通用的序列化配置,我们还是要掌握一些基本的配置方法。本篇博客最上面的参考资料链接的那篇文章中,给出了官方库 System.Text.Json 和 Newtonsoft.Json 较多常用的配置方法:

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

上面给出了我们需要的时间格式处理,忽略空值等,我们应用在项目里:

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;                    // 忽略空值
    });

再次调用接口,发现时间的格式变了:

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

我们再看一下空值的处理,我们不给一个 string 类型的参数赋值,则该参数默认为 null :

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

再次调用接口:

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

发现 Continent 已经被忽略了。

4. 其它

Microsoft.AspNetCore.Mvc.NewtonsoftJson 这个包肯定是依赖了 Newtonsoft.Json :

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

所以我们应该不必另外引入 Newtonsoft.Json 了。把这个包 Remove 掉,restore 一下,然后可以发现 Newtonsoft.Json 的功能依然可以使用:

ASP.NET Core MVC 如何用 NewtonsoftJson 处理 WEB API 的 返回值

上一篇:ASP.NET Core MVC中调用Json()时默认使用Newtonsoft.Json返回数据


下一篇:C# newtonsoft.json 对象转换Json时的一些高级(特殊)设置;枚举设置