数据库中部分表字段允许空值,则代码中实体类对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都为null,前端对应字段赋值需要做null值判断,随想到全局把null替换为""

网上找的方案都是重写了DefaultContractResolver,但是该方法只能解决string类型null→""的问题,对其他可空类型无效。

研究了下git 上Newtonsoft.Json和.netcore MVC的源码

最终使用自定义JsonOutputFormatter方式实现:

public class MyJsonOutputFormatter : JsonOutputFormatter
{
public MyJsonOutputFormatter(JsonSerializerSettings serializerSettings) : base(serializerSettings, ArrayPool<char>.Shared)
{
}
public new JsonSerializerSettings SerializerSettings => base.SerializerSettings;
protected override JsonWriter CreateJsonWriter(TextWriter writer)
{
if (writer == null)
{
throw new ArgumentNullException(nameof(writer));
}
var jsonWriter = new NullJsonWriter(writer)
{
ArrayPool = new JsonArrayPool<char>(ArrayPool<char>.Shared),
CloseOutput = false,
AutoCompleteOnClose = false
};
return jsonWriter;
}
}
public class NullJsonWriter : JsonTextWriter
{
public NullJsonWriter(TextWriter textWriter):base(textWriter)
{
}
public override void WriteNull()
{
this.WriteValue(String.Empty);
}
}

在 Startup 代码里面 修改

//services.AddMvc().AddJsonOptions(option => {
// //配置大小写问题,默认是首字母小写,该配置根据项目需要更改
// //option.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
// //配置序列化时时间格式为时间戳
// //option.SerializerSettings.ContractResolver = new NullToEmptyStringResolver();
// option.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
//});
services.AddMvc(config =>
{
var settings = new JsonSerializerSettings();
//设置首字母小写,如果不需要 则改为 DefaultContractResolver
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
//统一设置JsonResult中的日期格式
settings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
config.OutputFormatters.Insert(0, new MyJsonOutputFormatter(settings));
});

NetCore 统一处理 webapi 返回null 转为“”的更多相关文章

  1. ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)

    相关博文:ASP.NET Core WebApi 返回统一格式参数 业务场景: 统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例: { "respon ...

  2. .NetCore自定义WebAPI返回Json的格式大小写的三种方式

    .NetCore的Controller/WebAPI可以帮我们将返回结果自动转换为Json格式给前台,而且可以自由设定格式(大写.小写.首字母大写等),我总结了三种方法,对应三种灵活度,供大家参考 ( ...

  3. WebApi返回Json格式字符串

    WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...

  4. webapi返回json格式优化

    一.设置webapi返回json格式 在App_Start下的WebApiConfig的注册函数Register中添加下面这代码 config.Formatters.Remove(config.For ...

  5. (转)WebApi返回Json格式字符串

    原文地址:https://www.cnblogs.com/elvinle/p/6252065.html WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉 ...

  6. webapi返回json格式优化 转载https://www.cnblogs.com/GarsonZhang/p/5322747.html

    一.设置webapi返回json格式 在App_Start下的WebApiConfig的注册函数Register中添加下面这代码 1 config.Formatters.Remove(config.F ...

  7. 使用newtonsoft完美序列化WebApi返回的ValueTuple

    由于开发功能的需要,又懒得新建太多的class,所以ValueTuple是个比较好的偷懒方法,但是,由于WebApi需要返回序列化后的json,默认的序列化只能将ValueTuple定义的各个属性序列 ...

  8. C#操作xml SelectNodes,SelectSingleNode总是返回NULL 与 xPath 介绍

    一. SelectNodes,SelectSingleNode总是返回NULL 下面以一个简单的xml为例: <?xml version="1.0"?> <mes ...

  9. webapi返回文件流

    逻辑说明 webapi返回类型为IHttpActionResult接口,内部方法返回HttpResponseMessage. public interface IHttpActionResult { ...

随机推荐

  1. Nginx Rewrite相关功能-防盗链

    Nginx Rewrite相关功能-防盗链 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  2. Spring Cloud Sleuth + Zipkin 链路监控

    原文:https://blog.csdn.net/hubo_88/article/details/80878632 在微服务系统中,随着业务的发展,系统会变得越来越大,那么各个服务之间的调用关系也就变 ...

  3. php状态模式(state pattern)

    ... <?php /* The state pattern encapsulates the varying behavior for the same object based on its ...

  4. discuz x3.2简化的搜索框代码

    这是在做一个模板时改的,并不代表这是一个美化或者优化,只是特殊情况下的需要.只有一个搜索框,默认帖子搜索,无搜索按钮,输入内容直接回车搜索. <!--{if $_G['setting']['se ...

  5. lynis安装和扫描Linux的安全漏洞

    今天客户的服务器出了点问题需要排查具体的原因,在德国朋友的建议下用Lynis进行扫描,Lynis是Linux系统中的审计工具,能够对Linux系统的安全进行检测,在对系统进行扫描检测后,会生成安全报告 ...

  6. Gym - 102056C(2018EC final) -Heretical … Möbius ——CRT

    题意 给出一个长为200的01序列,判断是否在前1e9个莫比乌斯*值中.(这里的莫比乌斯值加了绝对值) 分析 意到因为4的倍数一定是0,9的倍数一定是0……169的倍数一定是0.那么我们可以对4,9, ...

  7. python基础之九:文件操作

    1.绝对路径与相对路径 path1 = "D:\orders.txt" # 绝对路径:包含根地址的路径 path2 = "homework.py" # 相对路径 ...

  8. Anaconda3(2)Anaconda3中安装TensorFlow

    https://zhuanlan.zhihu.com/p/34730661 1. 安装anaconda3:自行下载.安装[注意版本] (可参考引用链接) 2. 搭建TensorFlow环境 cuda1 ...

  9. Datagrip 2017.2 激活

    解决方法 参考网址:https://jetbrains-server.ru/2017/03/31/datagrip-2016-2017-activation/page/2/ 亲测使用http://id ...

  10. PCM存储格式 Intel 和 Motorola

    https://blog.csdn.net/cxz_yzxkj/article/details/84496614