.NET Core 處理 WebAPI JSON 返回煩人的null為空
前言
項目開發中不管是前臺還是後臺都會遇到煩人的null,數據庫表中字段允許空值,則代碼實體類中對應的字段類型為可空類型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都為null,前臺對應字段賦值需要做null值判斷,怎麼才能全局把null替換為空。
本文分享WebAPI接口服務統一返回null替換為空的方法。
一、分析問題
.NET Core中使用Newtonsoft.Json進行序列化,WebAPI接口返回格式通過Startup.cs類全局設置。想是否可以通過配置把null替換為空值?於是找到瞭Newtonsoft.Json在序列化和反序列化期間如何處理空值和默認值的屬性,具體配置代碼如下:
public void ConfigureServices(IServiceCollection services) { //配置Mvc + json 序列化 services.AddMvc() .AddNewtonsoftJson(options => { //數據格式首字母小寫 不使用駝峰 小駝峰firstName 大駝峰 FirstName options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); //使用默認方式,不更改元數據的key的大小寫 //options.SerializerSettings.ContractResolver = new DefaultContractResolver(); // 忽略循環引用 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // 設置時間格式 options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; //忽略空值 不包含屬性的null序列化 //options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; //忽略默認值和null 1、不包含屬性默認值和null //options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Igno }) }
1、空值的處理
序列化和反序列化時需要忽略值為null的屬性,設置SerializerSettings.NullValueHandling的值
- NullValueHandling.Ignore 序列化和反序列化對象時忽略空值。
- NullValueHandling.Include 序列化和反序列化對象時包含空值。
2、默認值的處理
序列化和反序列化時需要忽略默認值屬性,設置SerializerSettings.DefaultValueHandling的值
- DefaultValueHandling.Ignore 序列化和反序列化時忽略默認值
- DefaultValueHandling.Include序列化和反序列化時包含默認值
3、示例代碼
/*包含屬性的默認值與null序列化*/ { "Name": null, "Age": 0, "Partner": null, "Salary": 0.0 } /*不包含屬性的默認值序列化*/ { "Name": "Hello World", "Age": 28 } /*不包含屬性的null序列化*/ { "Name": "Hello World", "Age": 28, "Salary": 0.0 }
通過上面的分析:一種是不包含屬性的默認值序列化,另一種是不包含屬性的null序列化,都不能滿足目前的需求接口統一返回的null序列化為空。
二、解決問題
1、項目WebAPI默認返回的JSON結果格式如下:
{ "code": 0, "msg": "查詢成功", "data": { "id": 1, "title": "炎炎夏日暖暖肚", "describe": "", "author": null, "authorId": null, "linkSource": null, "author_Picture": null, "content": "炎炎夏日,很多人喜歡吃些寒涼的食物解暑,可這種做法非常傷身。", } }
2、需要解決的問題把所有的null替換為空,具體如下圖所示:
3、解決方案
需要自己寫一個NullToEmptyStringResolver類,然後重寫CamelCasePropertyNamesContractResolver,但是該方法隻能解決string類型null→””的問題,對其他可空類型無效,比如:int?、DateTime?等。
public class NullToEmptyStringResolver : CamelCasePropertyNamesContractResolver { /// <summary> /// 創建屬性 /// </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> /// 構造函數 /// </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> /// 設置Value /// </summary> /// <param name="target"></param> /// <param name="value"></param> public void SetValue(object target, object value) { _memberInfo.SetValue(target, value); } }
在Startup.cs代碼裡面修改,標記為紅色的代碼,如下所示:
//配置MVC+JSON序列化 services .AddMvc(options =>{options.EnableEndpointRouting = false;}) .AddNewtonsoftJson(options => { //使用默認方式,不更改元數據的key的大小寫 //options.SerializerSettings.ContractResolver = new DefaultContractResolver(); //數據格式首字母小寫 不使用駝峰 小駝峰firstName 大駝峰 FirstName //options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); options.SerializerSettings.ContractResolver = new NullToEmptyStringResolver(); // 忽略循環引用 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // 設置時間格式 options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; //忽略空值 不包含屬性的null序列化 //options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; //忽略默認值和null 1、不包含屬性默認值和null //options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Igno })
修改完配置,重新運行完成,實現null替換為空的效果,運行結果如下所示:
{ "code": 0, "msg": "查詢成功!", "data": { "id": 1, "title": "炎炎夏日暖暖肚", "describe": "", "author": "", "authorId": "", "linkSource": "", "author_Picture": "", "source": 0, "content": "炎炎夏日,很多人喜歡吃些寒涼的食物解暑,可這種做法非常傷身。" } }
三、總結
.NET Core下Newtonsoft.Json序列化時字符串null替換成空,通過ContractResolver類為屬性添加一些序列化設置、自定義屬性名、設置時間格式、有選擇性的序列化屬性等,實現WebAPI返回JSON格式統一化。
到此這篇關於.NET Core 處理 WebAPI JSON 返回煩人的null為空的文章就介紹到這瞭,更多相關.NET Core WebAPI JSON 返回null內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- c# 使用Json.NET實現json序列化
- asp.net core 集成swagger ui的原理解析
- C# 獲取動態key的json對象的值案例
- C#中對象與JSON字符串互相轉換的三種方式
- Unity實現動物識別的示例代碼