
如何快速實(shí)現(xiàn)REST API集成以優(yōu)化業(yè)務(wù)流程
{
//配置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
})
}
序列化和反序列化時需要忽略值為null的屬性,設(shè)置NullValueHandling的值
序列化和反序列化時需要忽略默認(rèn)值屬性,設(shè)置DefaultValueHandling的值
/*包含屬性的默認(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": "炎炎夏日,很多人喜歡吃些寒涼的食物解暑,可這種做法非常傷身。"
}
}
.NET Core下Newtonsoft.Json序列化時字符串null替換成空,通過ContractResolver類為屬性添加一些序列化設(shè)置、自定義屬性名、設(shè)置時間格式、有選擇性的序列化屬性等,實(shí)現(xiàn)WebAPI返回JSON格式統(tǒng)一化。
文章轉(zhuǎn)自微信公眾號@DotNet