1. 程式人生 > 其它 >ASP.NET Core MVC 如何用 NewtonsoftJson 處理 WEB API 的 返回值

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