ASP.NET Core MVC 如何用 NewtonsoftJson 處理 WEB API 的 返回值
參考資料:
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
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 的功能依然可以使用: