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

news/2024/10/11 18:16:45

前言

      项目开发中不管是前台还是后台都会遇到烦人的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  大驼峰 FirstNameoptions.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格式统一化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/53493.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

mysql磁盘碎片整理

背景 数据结转过程中经常进行 delete 操作,产生空白空间,如果进行新的插入操作,MySQL将尝试利用这些留空的区域,但仍然无法将其彻底占用,于是造成了数据的存储位置不连续,以及物理存储顺序与理论上的排序顺序不同,久而久之就产生了碎片。 碎片治理思路 根据线上处理经验总…

【SpringCloud】idea如何实现微服务多开

实现微服务多开背景:当需要使用相同的配置启动多个服务且host相同时,就需要在命令行指定不同的端口,但是 spring cloud 中远程配置默认会覆盖所有本地参数,所以需要修改默认覆盖优先级 一、默认优先级 二、配置远程配置优先级低于本地系统参数 # 是否允许本地配置覆盖远程配…

[ARC175E] Three View Drawing

构造My Blogs [ARC175E] Three View Drawing 哎,构造。 首先考虑 \(m=n^2\) 怎么做:显然是最上面一层填满第一条主对角线,第二层填满第二条主对角线...(主对角线指可以循环的对角线)。 把 \(n\) 变成满足 \(n^2\geq m\) 的最小的 \(n\)。然后考虑删去 \(n^2-m\) 个。可以发…

c/c++代码流程图生成

以下介绍2款皆免费 1.cxx2flow【github项目】c/c++函数解析为dot然后通过Graphviz渲染项目有附带gui程序可直接生成流程图,但是显示效果缩放不太行,建议解析生成dot后喂给其他基于Graphviz的渲染服务,使用过vscode上面的graphviz-interactive-preview,效果还行,也有在线网页…

算法与数据结构——哈希表

哈希表 哈希表(hash table),又称散列表,它通过建立键key与值value之间的映射,实现高效的元素查询。具体而言,我们向哈希表中输入一个键key,则可以在O(1)时间内获取对应的值value。 除哈希表外,数组和链表也可以实现查询功能,他们的效率对比如下表:添加元素:仅需将元…

Android systrace环境的搭建和使用

一、systrace简介 Systrace 是 Android4.1 中新增的性能数据采样和分析工具。它可帮助开发者收集 Android 关键子系统(如 SurfaceFlinger/SystemServer/Kernel/Input/Display 等 Framework 部分关键模块、服务,View系统等)的运行信息,从而帮助开发者更直观的分析系统瓶颈,…

threeJs 修改TransformControls的显示位置

有的时候模型的原点不是自身中心而是在场景的[0, 0, 0]位置这个时候想要让TransformControls的位置显示在模型的中心目前找的的处理方式是修改源码 找到updateMatrixWorld方法 updateMatrixWorld () {...for ( let i = 0; i < handles.length; i ++ ) {...if ( this.mode ==…

对于初创电商公司来说,选择API测试工具时应该考虑哪些因素?

成本效益: 初创公司通常预算有限,因此需要考虑工具的购买成本或订阅费用。 寻找提供免费版本或社区版的工具,这些版本可能已经满足基本需求。 易用性: 选择学习曲线较低的工具,以便团队成员可以快速上手。 界面友好和直观的工具可以减少培训时间和成本。 功能性: 确保所选…