本报讯 柬埔寨王宫事务部9月24日发布通告称,最受柬埔寨民众尊敬、爱戴的诺罗敦·莫尼列·西哈努克王太后陛下已年过花甲,目前正在北京的医院接受悉心治疗。...
2025-09-25 8
(给DotNet加星标,提升.Net技能)
前言
项目开发中不管是前台还是后台都会遇到烦人的null,数据库表中字段允许空值,则代码实体类中对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都为null,前台对应字段赋值需要做null值判断,怎么才能全局把null替换为空。
本文分享WebAPI接口服务统一返回null替换为空的方法。
一、分析问题
.NET Core中使用Newtonsoft.Json进行序列化,WebAPI接口返回格式通过Startup.cs类全局设置。想是否可以通过配置把null替换为空值?于是找到了Newtonsoft.Json在序列化和反序列化期间如何处理空值和默认值的属性,具体配置代码如下:
publicvoidConfigureServices(IServiceCollection services)
//配置Mvc + json 序列化
services.AddMvc
.AddNewtonsoftJson(options =>
//数据格式首字母小写 不使用驼峰
options.SerializerSettings.ContractResolver = newCamelCasePropertyNamesContractResolver;
//使用默认方式,不更改元数据的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的值
NullValueHandling.Ignore 序列化和反序列化对象时忽略空值
NullValueHandling.Include 序列化和反序列化对象时包含空值
2、默认值的处理
序列化和反序列化时需要忽略默认值属性,设置DefaultValueHandling的值
DefaultValueHandling.Ignore 序列化和反序列化时忽略默认值
DefaultValueHandling.Include序列化和反序列化时包含默认值
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?等。
publicclassNullToEmptyStringResolver: CamelCasePropertyNamesContractResolver
///<summary>
///创建属性
///</summary>
///<param name="type">类型 </param>
///<param name="memberSerialization">序列化成员 </param>
///<returns></returns>
protectedoverrideIList<JsonProperty> CreateProperties( Type type, MemberSerialization memberSerialization)
returntype.GetProperties.Select(c =>
varjsonProperty = base.CreateProperty(c, memberSerialization);
jsonProperty.ValueProvider = newNullToEmptyStringValueProvider(c);
returnjsonProperty;
}).ToList;
publicclassNullToEmptyStringValueProvider: IValueProvider
privatereadonlyPropertyInfo _memberInfo;
///<summary>
///构造函数
///</summary>
///<param name="memberInfo"></param>
publicNullToEmptyStringValueProvider( PropertyInfo memberInfo)
_memberInfo = memberInfo;
///<summary>
///获取Value
///</summary>
///<param name="target"></param>
///<returns></returns>
publicobjectGetValue( objecttarget )
varresult = _memberInfo.GetValue(target);
if(_memberInfo.PropertyType == typeof( string) && result == null)
result = string.Empty;
returnresult;
///<summary>
///设置Value
///</summary>
///<param name="target"></param>
///<param name="value"></param>
publicvoidSetValue( objecttarget, objectvalue)
_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 = newNullToEmptyStringResolver;
// 忽略循环引用
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格式统一化。
- EOF -
点击标题可跳转
性能超四倍的高性能.NET二进制序列化库
.NET Core 中的日志与分布式链路追踪
WebAPI解决发布后每隔一段时间请求变缓慢
看完本文有收获?请转发分享给更多人
推荐关注「DotNet」,提升.Net技能
点赞和在看就是最大的支持❤️
相关文章
本报讯 柬埔寨王宫事务部9月24日发布通告称,最受柬埔寨民众尊敬、爱戴的诺罗敦·莫尼列·西哈努克王太后陛下已年过花甲,目前正在北京的医院接受悉心治疗。...
2025-09-25 8
自从特鲁多政府在美国的怂恿下,对中国产电动汽车、钢铁和铝产品加征高额关税以来,加拿大与中国的关系就如同滑下了拼命向下的轨道。中国这一举动无疑是给加拿大...
2025-09-25 7
据报道,近年来的中美博弈已不仅仅体现在贸易战、科技封锁和军事对抗等领域,金融和资本市场的较量同样成为了全球关注的焦点。中国连续大规模减持美国国债,特别...
2025-09-25 7
近日,四川成都一自行车车迷赛中发生选手集体摔车事故,一名年轻男选手疑似膝盖伤情严重,被传“膝盖骨没了”,引发众多网友热议。日前,成都市体育局回应新黄河...
2025-09-25 5
【环球网快讯】据《以色列时报》25日最新消息,以色列军方宣布,一名以色列国防军士兵在加沙城遭巴勒斯坦伊斯兰抵抗运动(哈马斯)狙击手袭击身亡。 报道称,...
2025-09-25 7
花费不菲入住五星级酒店 半夜却无奈躲在阳台 究竟发生了什么? 近日 30岁的孙先生反映 夫妻俩入住上海星河湾酒店后 自己眼角膜受伤,视物不清 妻子肺部...
2025-09-25 5
每经编辑|何小桃 据新黄河9月24日报道,记者近日获悉,浙江省绍兴市轨道交通2号线9月13日晚曾发生一起地铁列车撞上保洁员致多人伤亡的安全事故。 多名...
2025-09-25 5
资料图:上海绿捷 本文综合上观新闻、正观新闻、采招网、21世纪经济报道等 昨天(9月23日)深夜,针对公众关注的“臭味学生餐”事件,上海官方发布通报称...
2025-09-25 6
发表评论