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

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

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

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

  1. public class MyJsonOutputFormatter : JsonOutputFormatter
  2. {
  3. public MyJsonOutputFormatter(JsonSerializerSettings serializerSettings) : base(serializerSettings, ArrayPool<char>.Shared)
  4. {
  5. }
  6. public new JsonSerializerSettings SerializerSettings => base.SerializerSettings;
  7. protected override JsonWriter CreateJsonWriter(TextWriter writer)
  8. {
  9. if (writer == null)
  10. {
  11. throw new ArgumentNullException(nameof(writer));
  12. }
  13. var jsonWriter = new NullJsonWriter(writer)
  14. {
  15. ArrayPool = new JsonArrayPool<char>(ArrayPool<char>.Shared),
  16. CloseOutput = false,
  17. AutoCompleteOnClose = false
  18. };
  19. return jsonWriter;
  20. }
  21. }
  22. public class NullJsonWriter : JsonTextWriter
  23. {
  24. public NullJsonWriter(TextWriter textWriter):base(textWriter)
  25. {
  26. }
  27. public override void WriteNull()
  28. {
  29. this.WriteValue(String.Empty);
  30. }
  31. }

在 Startup 代码里面 修改

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

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. canal中间件

    简介: 基于数据库增量(模拟MySQL slave的交互协议)日志解析,提供增量数据订阅和消费(客户端与canal建立关系) 安装版本:1.1.0 git 环境需求: jdk1.7以上 mysql开启 ...

  2. Jupyter 中的 10 个魔法函数

    1)%pwd 于显示Jupyter当前的工作空间. 2)%hist 显示当前Jupyter中,所有运行过的历史代码. 3)%who 显示当前Jupyter环境中的所有变量或名称. 4)%reset 删 ...

  3. The 2016 ACM-ICPC Asia China-Final L World Cup(深搜+回溯 暴力求解)

    题目分析: 对于A,B,C,D四支队伍,两两之间进行一场比赛,获胜得3分,平局得1分,失败不得分,现在对给出的四个队伍的得分,判断能否满足得到这种分数,且方案唯一输出yes,不唯一输出no,不可能则输 ...

  4. Consul 学习资料

    资料 网址 Consul 入门指南 https://book-consul-guide.vnzmi.com/

  5. 浏览器bug html 底部

  6. func_get_args call_user_func_array

    <?php //call_user_func_array.php function test($arg1,$arg2) { $t_args = func_get_args(); $t_resul ...

  7. 【转载】浅析从外部访问 Kubernetes 集群中应用的几种方式

    一般情况下,Kubernetes 的 Cluster Network 是属于私有网络,只能在 Cluster Network 内部才能访问部署的应用.那么如何才能将 Kubernetes 集群中的应用 ...

  8. 【Linux】netstat命令

    https://www.cnblogs.com/ftl1012/p/netstat.html这个讲的不错 https://www.linuxprobe.com/netstat-common-metho ...

  9. [RN] React Native 定义全局变量

    React Native 定义全局变量 React Native全局变量的两种使用方式 一.导出和导入 // 定义的页面 global.js var global = {authorization: ...

  10. debian/ubuntu安装mssql

    添加源: debian源:deb [arch=amd64] https://packages.microsoft.com/debian/10/prod buster main ubuntu源:deb ...