华域联盟 .Net .NET Core 处理 WebAPI JSON 返回烦人的null为空

.NET Core 处理 WebAPI JSON 返回烦人的null为空

.NET Core 处理 WebAPI JSON 返回烦人的null为空
 更新时间:2021年01月13日 11:38:47   作者:Crazy Struggle  

这篇文章主要介绍了.NET Core 处理 WebAPI JSON 返回烦人的null为空,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

      项目开发中不管是前台还是后台都会遇到烦人的null,数据库表中字段允许空值,则代码实体类中对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都为null,前台对应字段赋值需要做null值判断,怎么才能全局把null替换为空。
      本文分享WebAPI接口服务统一返回null替换为空的方法。
一、分析问题

      .NET Core中使用Newtonsoft.Json进行序列化,WebAPI接口返回格式通过Startup.cs类全局设置。想是否可以通过配置把null替换为空值?于是找到了Newtonsoft.Json在序列化和反序列化期间如何处理空值和默认值的属性,具体配置代码如下:

public void ConfigureServices(IServiceCollection services)
{
//配置Mvc + json 序列化
services.AddMvc()
.AddNewtonsoftJson(options =>
{
//数据格式首字母小写 不使用驼峰 小驼峰firstName 大驼峰 FirstName
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的属性,设置SerializerSettings.NullValueHandling的值

 NullValueHandling.Ignore 序列化和反序列化对象时忽略空值。
 NullValueHandling.Include 序列化和反序列化对象时包含空值。

2、默认值的处理
      序列化和反序列化时需要忽略默认值属性,设置SerializerSettings.DefaultValueHandling的值

DefaultValueHandling.Ignore 序列化和反序列化时忽略默认值
DefaultValueHandling.Include序列化和反序列化时包含默认值

3、示例代码

/*包含属性的默认值与null序列化*/
{
"Name": null,
"Age": 0,
"Partner": null,
"Salary": 0.0
}
/*不包含属性的默认值序列化*/
{
"Name": "Hello World",
"Age": 28
}
/*不包含属性的null序列化*/
{
"Name": "Hello World",
"Age": 28,
"Salary": 0.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格式统一化。

到此这篇关于.NET Core 处理 WebAPI JSON 返回烦人的null为空的文章就介绍到这了,更多相关.NET Core WebAPI JSON 返回null内容请搜索华域联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持华域联盟!

您可能感兴趣的文章:详解.NET Core 3.0 里新的JSON API.Net Core读取Json配置文件的实现示例浅析.Net Core中Json配置的自动更新.NET Core简单读取json配置文件.NetCore获取Json和Xml格式的配置信息ASP.NET core Web中使用appsettings.json配置文件的方法

.NET
Core
WebAPI
JSON
null

相关文章
Asp.net SignalR应用并实现群聊功能这篇文章主要为大家分享了Asp.net SignalR应用并实现群聊功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2017-04-04
ASP.NET设计网络硬盘之删除文件夹实现代码对于不再需要的文件/文件夹用户有权限做删除处理。这一节就介绍如何实现这一功能 2012-10-10
详解ASP.NET Core和ASP.NET Framework共享身份验证本篇文章主要介绍了详解ASP.NET Core和ASP.NET Framework共享身份验证 ,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
2016-12-12
手把手教你在.NET中创建Web服务实现方法这篇文章主要介绍了.NET中创建Web服务实现方法,有需要的朋友可以参考一下 2013-12-12
ASP.Net的Application介绍注:这个事件,写不写On是一样的。如Application_End与Application_OnEnd是一样的 2013-07-07
分析10个ASP.NET控件最有用的属性详解对于微软平台开发人员而言,每天都要和各种ASP.NET控件打交道,本文不打算介绍各种控件的具体使用方法,相反,我只想和大家分享一下ASP.NET控件最有用的10个属性,相信读完本文可提升你的开发技能。 2011-08-08
ASP.NET使用WebService实现天气预报功能这篇文章主要为大家详细介绍了ASP.NET使用WebService实现天气预报功能的相关资料,感兴趣的小伙伴们可以参考一下 2016-08-08
c# static 静态数据成员静态成员属于类所有,为各个类的实例所公用,无论类创建了几多实例,类的静态成员在内存中只占同一块区域。 2009-06-06
ASP.net无法加载oci.dll解决新法最近突然发现运行程序时会出现:无法加载oci.dll 的错误,上网找了好久,总算解决了.下面把方法分享给大家。 2015-03-03
完美兼容ie和firefox的asp.net网站加入收藏和设置主页这篇文章主要介绍了完美兼容ie和firefox的asp.net网站加入收藏和设置主页,需要的朋友可以参考下 2014-12-12

最新评论

本文由 华域联盟 原创撰写:华域联盟 » .NET Core 处理 WebAPI JSON 返回烦人的null为空

转载请保留出处和原文链接:https://www.cnhackhy.com/5001.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者:

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部