当前位置:首页 » 《随便一记》 » 正文

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

13 人参与  2024年10月20日 10:00  分类 : 《随便一记》  评论

点击全文阅读


目录

前言

一、分析问题

1、空值的处理

2、默认值的处理

3、示例代码

二、解决问题

1、返回的Json

2、null替换为空

3、解决方案

三、总结

四、最后


前言

项目开发中不管是前台还是后台都会遇到烦人的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、返回的Json

项目WebAPI默认返回的JSON结果格式如下:

{  "code": 0,  "msg": "查询成功",  "data": {    "id": 1,    "title": "炎炎夏日暖暖肚",    "describe": "",    "author": null,    "authorId": null,    "linkSource": null,    "author_Picture": null,    "content": "炎炎夏日,很多人喜欢吃些寒凉的食物解暑,可这种做法非常伤身。",  }}

2、null替换为空

需要解决的问题把所有的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://zhangshiyu.com/post/174454.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1