{
//配置Mvc + json 序列化
services.AddMvc()
.AddNewtonsoftJson(options =>
{
//數(shù)據(jù)格式首字母小寫 不使用駝峰
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
//使用默認(rèn)方式,不更改元數(shù)據(jù)的key的大小寫
//options.SerializerSettings.ContractResolver = new DefaultContractResolver();
// 忽略循環(huán)引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
// 設(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、空值的處理

序列化和反序列化時需要忽略值為null的屬性,設(shè)置NullValueHandling的值

2、默認(rèn)值的處理

序列化和反序列化時需要忽略默認(rèn)值屬性,設(shè)置DefaultValueHandling的值

3、示例代碼

/*包含屬性的默認(rèn)值與null序列化*/
{
"Name": null,
"NickName": null,
"Age": 0,
"Sex": 0
}
/*不包含屬性的默認(rèn)值序列化*/
{
"Name": "Hello World",
"Age": 24
}
/*不包含屬性的null序列化*/
{
"Name": "Hello World",
"Age": 28,
"Sex": 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、解決方案

需要自己寫一個NullToEmptyStringResolver類,然后重寫CamelCasePropertyNamesContractResolver,但是該方法只能解決string類型null→””的問題,對其他可空類型無效,比如: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è)置時間格式
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序列化時字符串null替換成空,通過ContractResolver類為屬性添加一些序列化設(shè)置、自定義屬性名、設(shè)置時間格式、有選擇性的序列化屬性等,實(shí)現(xiàn)WebAPI返回JSON格式統(tǒng)一化。

文章轉(zhuǎn)自微信公眾號@DotNet

上一篇:

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

下一篇:

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

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費(fèi)

#AI深度推理大模型API

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

10個渠道
一鍵對比試用API 限時免費(fèi)