zoukankan      html  css  js  c++  java
  • 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:

    然后在 ConfigureServices 中 Add 一下:

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

    1. 引入包

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

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

    然后这里就有了:

    2. 尝试使用

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

    用 Postman 请求一下:

    可以看到,即使我们返回的对象的属性,如NameAge,都是大写字母开头,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 的功能依然可以使用:

  • 相关阅读:
    1144 The Missing Number (20分)
    1145 Hashing
    1146 Topological Order (25分)
    1147 Heaps (30分)
    1148 Werewolf
    1149 Dangerous Goods Packaging (25分)
    TypeReference
    Supervisor安装与配置()二
    谷粒商城ES调用(十九)
    Found interface org.elasticsearch.common.bytes.BytesReference, but class was expected
  • 原文地址:https://www.cnblogs.com/Kit-L/p/15169205.html
Copyright © 2011-2022 走看看