{
//配置Mvc + json 序列化
services.AddMvc()
.AddNewtonsoftJson(options =>
{
//數據格式首字母小寫 不使用駝峰
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的屬性,設置NullValueHandling的值

2、默認值的處理

序列化和反序列化時需要忽略默認值屬性,設置DefaultValueHandling的值

3、示例代碼

/*包含屬性的默認值與null序列化*/
{
"Name": null,
"NickName": null,
"Age": 0,
"Sex": 0
}
/*不包含屬性的默認值序列化*/
{
"Name": "Hello World",
"Age": 24
}
/*不包含屬性的null序列化*/
{
"Name": "Hello World",
"Age": 28,
"Sex": 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格式統一化。

文章轉自微信公眾號@DotNet

上一篇:

OpenAI 實時 API(語音模式),Colab 入門

下一篇:

FastAPI:重燃Python Web開發的火花
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費