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 的功能依然可以使用:

  • 相关阅读:
    GSON -JSON 反序列化-多节点名称支持
    Jedis 分片原理
    闭锁-CountDownLatch
    XML序列化及反序列化
    用GIT操作SVN
    报表worker-CPU使用率过高原因排查
    二.PlantUML 之活动图
    一.PlantUML 与 IDEA 集成
    ArrayList
    VI常用命令
  • 原文地址:https://www.cnblogs.com/Kit-L/p/15169205.html
Copyright © 2011-2022 走看看