欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.NET Core 處理 WebAPI JSON 返回?zé)┤说膎ull為空

 更新時(shí)間:2021年01月13日 11:38:47   作者:Crazy Struggle  
這篇文章主要介紹了.NET Core 處理 WebAPI JSON 返回?zé)┤说膎ull為空,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

      項(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)文章

最新評(píng)論