.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替换为空,详细如下图所示:

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

       

3、办理方案

需要本身写一个NullToEmptyStringResolver类,然后重写CamelCasePropertyNamesContractResolver,可是该要领只能办理string范例null→""的问题,对其他可空范例无效,好比:int?、DateTime?等。

public class NullToEmptyStringResolver : CamelCasePropertyNamesContractResolver { /// <summary> /// 建设属性 /// </summary> /// <param>范例</param> /// <param>序列化成员</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></param> public NullToEmptyStringValueProvider(PropertyInfo memberInfo) { _memberInfo = memberInfo; } /// <summary> /// 获取Value /// </summary> /// <param></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></param> /// <param></param> public void SetValue(object target, object value) { _memberInfo.SetValue(target, value); } }

在Startup.cs代码内里修改,标志为赤色的代码,如下所示:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdxww.html