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

目录

前言

一、分析问题

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  大驼峰 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、返回的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格式统一化。

四、最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家关注学习  

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】Python单元测试

文章目录 01-单元测试基础什么是单元测试常用的文件结构运行单元测试 02. 断言函数03. Test Fixtures什么是Test Fixtures模块级别的Fixtures类级别的Fixtures方法级别的Fixtures 04.Mock 01-单元测试基础 什么是单元测试常用的文件结构编写第一个单元测试运行单元测试 什么是单…

springsecurity的学习(四):实现授权

简介 springsecurity的授权&#xff0c;自定义授权失败的处理&#xff0c;跨域的处理和自定义权限校验方法的介绍 授权 权限系统作用 在后台进行用户权限的判断&#xff0c;判断当前用户是否有相应的权限&#xff0c;必须具有所需的权限才能进行相应的操作&#xff0c;以此…

【运维】JetBrains Gateway (Pycharm) SSH免密连接,改为免密连接

一直要求输入密码&#xff0c;很烦人&#xff1a; 如何免密连接&#xff1f; 1 重新打开gateway&#xff0c;来到这个界面点新建连接&#xff1a; 2 点这里设置&#xff1a; 3 在这一页&#xff0c;你可以改你的所有配置&#xff0c;只要设置为password并且保存密码&…

MySQL第6讲--DQL(数据查询语言)的基本操作之基本和条件查询

文章目录 前言DQL(数据查询语言)基本操作查询操作基本查询示例1&#xff1a;查询表格的name&#xff0c;age&#xff0c;并返回&#xff1b;示例2&#xff1a;查询表格中的所有字段&#xff1b;示例3&#xff1a;查询所有员工的工号并返回&#xff0c;起别名&#xff1b;示例4&…

基于Python的去哪儿网数据采集与分析可视化大屏设计与实现

摘要 本文旨在介绍如何利用Python进行去哪儿网景点数据的采集与分析。通过采集去哪儿网上的景点数据&#xff0c;我们可以获取大量的旅游相关信息&#xff0c;并基于这些数据进行深入分析和洞察&#xff0c;为旅游行业、市场营销策略以及用户个性化推荐等提供支持。 本文将使用…

实现挂机会议

png py文件 import os import pyautogui import time from typing import Callable, Tuple from datetime import datetime import cv2 import schedule#通过图像模板匹配在屏幕上找到指定区域并操作 def imgAutoClick(tempFile: str, whatDo: Callable[[Tuple[int, int, int…

【机器学习】混淆矩阵(Confusion Matrix)

一、混淆矩阵 True Negative (TN)&#xff1a; 真负类&#xff0c;样本的真实类别是负类&#xff0c;并且模型将其识别为负类&#xff0c;cm[0][0]。False Positive (FP)&#xff1a; 假正类&#xff0c;样本的真实类别是负类&#xff0c;但是模型将其识别为正类&#xff0c;cm…

【C语言】常用函数汇总表

目录 1. C语言常用函数汇总表&#xff08;概念功能&#xff09;1.1 输入/输出函数&#xff08;<stdio.h>&#xff09;1.2 字符串操作函数&#xff08;<string.h>&#xff09;1.3 内存管理函数&#xff08;<stdlib.h>&#xff09;1.4 数学函数&#xff08;<…

【原创】java+springboot+mysql学业跟踪指导管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Unity物理模块 之 ​2D刚体

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 1.刚体是什么 在 Unity 中&#xff0c;刚体&#xff08;Rigidbody&#xff09; 是物理引擎中最基本的组件之一&#x…

根据字典值回显,有颜色的

背景 本项目以若依前端vue2版本为例&#xff0c;项目中有根据字典值回显文本的函数selectDictLabel&#xff0c;但是有时候我们需要带颜色的回显&#xff0c;大概这样的 用法 <template v-slotscope><dict-label :options"dangerLevelOptions" :value&qu…

XXL-JOB分布式定时任务框架快速入门

文章目录 前言定时任务分布式任务调度 1、XXL-JOB介绍1.1 XXL-JOB概述1.2 XXL-JOB特性1.3 整体架构 2、XXL-JOB任务中心环境搭建2.1 XXL-JOB源码下载2.2 IDEA导入xxljob工程2.3 初始化数据库2.4 Docker安装任务管理中心 3、XXL-JOB任务注册测试3.1 引入xxl-job核心依赖3.2 配置…

deepin V23前瞻丨deepin V23与飞腾腾锐D3000完成适配,持续丰富deepin操作系统硬件生态

查看原文 近日&#xff0c;自主核心芯片研发飞腾公司宣布与deepin V23完成适配&#xff0c;包含飞腾新一代桌面CPU飞腾腾锐D3000、FT-2000/64、桌面芯片飞腾腾锐D2000等多款产品&#xff0c;为用户带来更智能、安全、稳定的使用体验。 飞腾腾锐D3000集成8个飞腾自主研发的新一…

Golang多版本环境安装并存

1. 准备 请先安装最新版本的Go&#xff0c;详见 https://go.dev/doc/install go version2. 配置镜像加速 go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct3. 安装Go指定版本 Golang官方提供dl工具来实现多版本的Go环境管理&#xff0c;详见项目&#…

小白零基础学数学建模应用系列(二):基于Python的共享单车系统建模与仿真分析

共享单车系统作为一种绿色环保的出行方式&#xff0c;已成为现代城市公共交通的重要组成部分。本文将使用Python编程语言&#xff0c;并结合modsim库&#xff0c;构建并仿真一个共享单车系统的模型&#xff0c;通过这一过程来展示如何进行系统的建模与分析。 文章目录 一、背景…

虚拟化—XenServer安装教程详细(附客户端连接)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

Unity 编写自己的aar库,接收Android广播(broadcastReceiver)并传递到Unity

编写本文是因为找了很多文章&#xff0c;都比较片段&#xff0c;不容易理解&#xff0c;对于Android新手来说理解起来不友好。我这里写了一个针对比较小白的文章&#xff0c;希望有所帮助。 Android端 首先还是先来写Android端&#xff0c;我们新建一个Android空项目&#xf…

重新定义AI绘画体验,Midjourney全面进阶指令指南

前言 在人工智能绘画的世界里,Midjourney无疑是一颗璀璨的明珠。今天,就让我们一同探索这个神奇工具的奥秘,开启一段全新的AI绘画之旅。 一、奇妙之门:Midjourney的本质 与众不同的是,Midjourney并非一个单纯的软件,而是栖身于Discord平台的一位"云端画师"。有别于本…

【微信小程序】网络数据请求

1. 小程序中网络数据请求的限制 2. 配置 request 合法域名 3. 发起 GET 请求 调用微信小程序提供的 wx.request() 方法&#xff0c;可以发起 GET 数据请求&#xff0c;示例代码如下&#xff1a; 4. 发起 POST 请求 调用微信小程序提供的 wx.request() 方法&#xff0c;可以…

(计算机网络)网络层

目录 一.网络层提供哪种服务 二.两种服务的比较 三.ip协议 四.ip地址 五.ip地址的分类 六.子网掩码 七.路由器介绍 一.网络层提供哪种服务 1.ip地址--唯一的标识互联网上的某一台主机 2. 虚电路&#xff1a;虚拟的电路 二.两种服务的比较 ip数据报&#xff0c;不需要建…