.NET Core 處理 WebAPI JSON 返回?zé)┤说膎ull為空
前言
項(xiàng)目開發(fā)中不管是前臺(tái)還是后臺(tái)都會(huì)遇到煩人的null,數(shù)據(jù)庫(kù)表中字段允許空值,則代碼實(shí)體類中對(duì)應(yīng)的字段類型為可空類型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都為null,前臺(tái)對(duì)應(yīng)字段賦值需要做null值判斷,怎么才能全局把null替換為空。
本文分享WebAPI接口服務(wù)統(tǒng)一返回null替換為空的方法。
一、分析問題
.NET Core中使用Newtonsoft.Json進(jìn)行序列化,WebAPI接口返回格式通過Startup.cs類全局設(shè)置。想是否可以通過配置把null替換為空值?于是找到了Newtonsoft.Json在序列化和反序列化期間如何處理空值和默認(rèn)值的屬性,具體配置代碼如下:
public void ConfigureServices(IServiceCollection services) { //配置Mvc + json 序列化 services.AddMvc() .AddNewtonsoftJson(options => { //數(shù)據(jù)格式首字母小寫 不使用駝峰 小駝峰firstName 大駝峰 FirstName options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); //使用默認(rèn)方式,不更改元數(shù)據(jù)的key的大小寫 //options.SerializerSettings.ContractResolver = new DefaultContractResolver(); // 忽略循環(huán)引用 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // 設(shè)置時(shí)間格式 options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; //忽略空值 不包含屬性的null序列化 //options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; //忽略默認(rèn)值和null 1、不包含屬性默認(rèn)值和null //options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Igno }) }
1、空值的處理
序列化和反序列化時(shí)需要忽略值為null的屬性,設(shè)置SerializerSettings.NullValueHandling的值
- NullValueHandling.Ignore 序列化和反序列化對(duì)象時(shí)忽略空值。
- NullValueHandling.Include 序列化和反序列化對(duì)象時(shí)包含空值。
2、默認(rèn)值的處理
序列化和反序列化時(shí)需要忽略默認(rèn)值屬性,設(shè)置SerializerSettings.DefaultValueHandling的值
- DefaultValueHandling.Ignore 序列化和反序列化時(shí)忽略默認(rèn)值
- DefaultValueHandling.Include序列化和反序列化時(shí)包含默認(rèn)值
3、示例代碼
/*包含屬性的默認(rèn)值與null序列化*/ { "Name": null, "Age": 0, "Partner": null, "Salary": 0.0 } /*不包含屬性的默認(rèn)值序列化*/ { "Name": "Hello World", "Age": 28 } /*不包含屬性的null序列化*/ { "Name": "Hello World", "Age": 28, "Salary": 0.0 }
通過上面的分析:一種是不包含屬性的默認(rèn)值序列化,另一種是不包含屬性的null序列化,都不能滿足目前的需求接口統(tǒng)一返回的null序列化為空。
二、解決問題
1、項(xiàng)目WebAPI默認(rèn)返回的JSON結(jié)果格式如下:
{ "code": 0, "msg": "查詢成功", "data": { "id": 1, "title": "炎炎夏日暖暖肚", "describe": "", "author": null, "authorId": null, "linkSource": null, "author_Picture": null, "content": "炎炎夏日,很多人喜歡吃些寒涼的食物解暑,可這種做法非常傷身。", } }
2、需要解決的問題把所有的null替換為空,具體如下圖所示:
3、解決方案
需要自己寫一個(gè)NullToEmptyStringResolver類,然后重寫CamelCasePropertyNamesContractResolver,但是該方法只能解決string類型null→""的問題,對(duì)其他可空類型無效,比如:int?、DateTime?等。
public class NullToEmptyStringResolver : CamelCasePropertyNamesContractResolver { /// <summary> /// 創(chuàng)建屬性 /// </summary> /// <param name="type">類型</param> /// <param name="memberSerialization">序列化成員</param> /// <returns></returns> protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { return type.GetProperties().Select(c => { var jsonProperty = base.CreateProperty(c, memberSerialization); jsonProperty.ValueProvider = new NullToEmptyStringValueProvider(c); return jsonProperty; }).ToList(); } } public class NullToEmptyStringValueProvider : IValueProvider { private readonly PropertyInfo _memberInfo; /// <summary> /// 構(gòu)造函數(shù) /// </summary> /// <param name="memberInfo"></param> public NullToEmptyStringValueProvider(PropertyInfo memberInfo) { _memberInfo = memberInfo; } /// <summary> /// 獲取Value /// </summary> /// <param name="target"></param> /// <returns></returns> public object GetValue(object target) { var result = _memberInfo.GetValue(target); if (_memberInfo.PropertyType == typeof(string) && result == null) result = string.Empty; return result; } /// <summary> /// 設(shè)置Value /// </summary> /// <param name="target"></param> /// <param name="value"></param> public void SetValue(object target, object value) { _memberInfo.SetValue(target, value); } }
在Startup.cs代碼里面修改,標(biāo)記為紅色的代碼,如下所示:
//配置MVC+JSON序列化 services .AddMvc(options =>{options.EnableEndpointRouting = false;}) .AddNewtonsoftJson(options => { //使用默認(rèn)方式,不更改元數(shù)據(jù)的key的大小寫 //options.SerializerSettings.ContractResolver = new DefaultContractResolver(); //數(shù)據(jù)格式首字母小寫 不使用駝峰 小駝峰firstName 大駝峰 FirstName //options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); options.SerializerSettings.ContractResolver = new NullToEmptyStringResolver(); // 忽略循環(huán)引用 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // 設(shè)置時(shí)間格式 options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; //忽略空值 不包含屬性的null序列化 //options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; //忽略默認(rèn)值和null 1、不包含屬性默認(rèn)值和null //options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Igno })
修改完配置,重新運(yùn)行完成,實(shí)現(xiàn)null替換為空的效果,運(yùn)行結(jié)果如下所示:
{ "code": 0, "msg": "查詢成功!", "data": { "id": 1, "title": "炎炎夏日暖暖肚", "describe": "", "author": "", "authorId": "", "linkSource": "", "author_Picture": "", "source": 0, "content": "炎炎夏日,很多人喜歡吃些寒涼的食物解暑,可這種做法非常傷身。" } }
三、總結(jié)
.NET Core下Newtonsoft.Json序列化時(shí)字符串null替換成空,通過ContractResolver類為屬性添加一些序列化設(shè)置、自定義屬性名、設(shè)置時(shí)間格式、有選擇性的序列化屬性等,實(shí)現(xiàn)WebAPI返回JSON格式統(tǒng)一化。
到此這篇關(guān)于.NET Core 處理 WebAPI JSON 返回?zé)┤说膎ull為空的文章就介紹到這了,更多相關(guān).NET Core WebAPI JSON 返回null內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp. net下使用foreach簡(jiǎn)化文本文件的訪問。
asp. net下使用foreach簡(jiǎn)化文本文件的訪問。...2007-04-04Entity?Framework?Core種子數(shù)據(jù)Data-Seeding
這篇文章介紹了Entity?Framework?Core種子數(shù)據(jù)Data-Seeding的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03.NET Core使用EF生成數(shù)據(jù)庫(kù)出錯(cuò)的解決方法
這篇文章介紹了.NET Core使用EF生成數(shù)據(jù)庫(kù)出錯(cuò)的解決方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01HttpRequest Get和Post調(diào)用其他頁面的方法
HttpRequest Get和Post調(diào)用其他頁面的方法,需要的朋友可以參考一下2013-03-03.NET Core Windows環(huán)境安裝配置教程
這篇文章主要為大家詳細(xì)介紹了.NET Core Windows環(huán)境安裝配置教程,感興趣的小伙伴們可以參考一下2016-07-07ASP.NET中GridView、DataList、DataGrid三個(gè)數(shù)據(jù)控件foreach遍歷用法示例
這篇文章主要介紹了ASP.NET中GridView、DataList、DataGrid三個(gè)數(shù)據(jù)控件foreach遍歷用法,結(jié)合實(shí)例形式分析了GridView、DataList、DataGrid使用foreach及for語句進(jìn)行數(shù)據(jù)遍歷的具體使用方法,需要的朋友可以參考下2016-08-08.NET Core使用HttpClient進(jìn)行表單提交時(shí)遇到的問題
這篇文章主要介紹了.NET Core使用HttpClient進(jìn)行表單提交時(shí)遇到的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12擁有網(wǎng)頁版小U盤 ASP.NET實(shí)現(xiàn)文件上傳與下載功能
這篇文章主要為大家詳細(xì)介紹了ASP.NET實(shí)現(xiàn)文件上傳與下載功能,類似于U盤功能,具有一定的參考價(jià)值。感興趣的小伙伴們可以參考一下2016-08-08