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

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格式统一化。

到此这篇关于.NET Core 处理 WebAPI JSON 返回烦人的null为空的文章就介绍到这了,更多相关.NET Core WebAPI JSON 返回null内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅析.Net Core中Json配置的自动更新

    Pre 很早在看 Jesse 的 Asp.net Core快速入门 的课程的时候就了解到了在Asp .net core中,如果添加的Json配置被更改了,是支持自动重载配置的,作为一名有着严重"造轮子"情节的程序员,最近在折腾一个博客系统,也想造出一个这样能自动更新以Mysql为数据源的ConfigureSource,于是点开了AddJsonFile这个拓展函数的源码,发现别有洞天,蛮有意思,本篇文章就简单地聊一聊Json config的ReloadOnChange是如何实现的,在学习

  • .Net Core读取Json配置文件的实现示例

    前言:在与传统的asp.net MVC项目相比,.net core项目在项目目录的文件结构上和功能上与前者都有很大的区别.例如:在.net core中使用Startup.cs取代Global.asax文件用于加载应用程序的配置和各种启动项.appsettings.json取代web.config文件用于存储应用程序所需的配置参数等等... OK!步入正题,下面来说一下如何读取Json配置文件中的参数. 第一种:使用IConfiguration接口 我们先在appsettings.json中配置好

  • 详解.NET Core 3.0 里新的JSON API

    为什么需要新的 JSON API ? JSON.NET  大家都用过,老版本的 ASP.NET Core 也依赖于 JSON.NET . 然而这个依赖就会引起一些版本问题:例如 ASP .NET  Core某个版本需要使用 JSON .NET  v10 ,而另一个库需要使用 JSON.NET  v11 :或者 JSON .NET   出现了一个新版本,而ASP .NET Core 还不能支持这个版本,而您却想使用该版本. System.Text.Json   随着 NET Core  3.0 的

  • .NET Core简单读取json配置文件

    背景 目前发现网上的 .NET Core 读取 json 格式的配置文件有点麻烦,自己想搞个简单点的. .NET Core 目前的主流形式是采用 json 格式来存储配置文件信息,跟之前的诸如 app.config 和 web.config 等 xml 形式的配置文件有所区别. json 文件 demo appsettings.json: { "name": "wen", "age": 26, "family": { &quo

  • ASP.NET core Web中使用appsettings.json配置文件的方法

    前言 最近在研究把asp.net程序移植到linux上,正好.net core出来了,就进行了学习. 移植代码基本顺利,但是发现.net core中没有ConfigurationManager,无法读写配置文件,单独写个xml之类的嫌麻烦,就谷歌了下,发现了个方法,遂记录如下,方便以后查找: 方法如下 配置文件结构 public class DemoSettings { public string MainDomain { get; set; } public string SiteName {

  • .NetCore获取Json和Xml格式的配置信息

    本篇将和大家分享的是:如何获取Json和Xml格式的配置信息,主要介绍的是Configuration扩展方法的使用,因为netcore的web应用在Startup中已经默认嵌入appsettings.json文件的配置信息,故而我把测试点放在在了netcore的控制台应用上:控制台上使用配置文件也是常用的事情,并且官网实例主要讲解的是json格式,对xml格式直接带过了,因此有了本篇的分享,希望能给你好的帮助: 获取Json配置信息 获取Xml配置信息 获取xml节点属性值 配置文件能否不和应用

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

    前言 项目开发中不管是前台还是后台都会遇到烦人的null,数据库表中字段允许空值,则代码实体类中对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都为null,前台对应字段赋值需要做null值判断,怎么才能全局把null替换为空. 本文分享WebAPI接口服务统一返回null替换为空的方法. 一.分析问题 .NET Core中使用Newtonsoft.Json进行序列化,WebAPI接口返回格式通过Startup.cs类全局设置.想是否可

  • .Net Core解决WebAPI中返回时间格式带T的问题

    在项目开发中遇到了返回的时间格式带T的问题,如图所示: 直接把这种结果返回给前端,前端很难处理这个时间格式问题,所以就需要后端在返回数据的时候对这种格式进行处理. 新建Order类: using System; namespace WebApiTest { public class Order { public int ID { get; set; } public DateTime OrderTime { get; set; } } } 新建一个格式化类DatetimeJsonConverte

  • Java代码中如何去掉烦人的“!=null”

    问题 为了避免空指针调用,我们经常会看到这样的语句 ...if (someobject != null) { someobject.doCalc();}... 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢? 精华回答: 这是初.中级程序猿经常会遇到的问题.他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空.另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判空. 吐槽完毕,回到这个题目本

  • springboot2.1.7去除json返回字段中为null的字段

    一般我们会设置返回VO对象的类型为 @Data public class ResponseVO<T> { private Integer status; private String msg; private T data; public ResponseVO(Integer status, String msg) { this.status = status; this.msg = msg; } } 但如果不需要返回泛型T,即泛型T为null就会出现以下字段 { "status&q

  • Json返回时间的格式中出现乱码问题的两种解决方案

    前言:这段时间一直没有写博客,首先是我正在实现权限系列的绝色和操作的实现,因为这些东西在前面我们都已经说过了,所以我们就不重复的说这些了,那么我们知道,在我们使用Json返回数据的时候时间的格式一般都会变了,变成我们不认识的一些字符,那么当我们遇到这些问题的时候我们该怎么解决呢,今天我就来小说一下这个的解决方法. .发现问题 (1).正如我们在前言里面所说,我们在编写Json解析时间的时候会返回一些莫名其妙的东西,那么我们是如何解决这个问题的呢?我现在有两种方法可以解决这个问题,下面我们首先来说

  • C# WebApi 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇C#进阶系列--WebApi接口传参不再困惑:传参详解,这篇博文内容本身很基础,没想到引起很多园友关注,感谢大家的支持.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了下WebApi的传参机制,今天再来看看WebApi里面另一个重要而又基础的知识点:返回值.还是那句话:本篇针对初初使用WebApi的同学们,比较基础,有兴趣的且看看.

  • Django中使用Json返回数据的实现方法

    在一个网站在,大量数据与前端交互,JSON是最好的传递数据方式了. 在Django中,使用JSON传输数据,有两种方式,一种是使用Python的JSON包,一种是使用Django的JsonResponse 方法一:使用Python的JSON包 from django.shortcuts import HttpResponse import json def testjson(request): data={ 'patient_name': '张三', 'age': '25', 'patient_

  • 在 asp.net core 的中间件中返回具体的页面的实现方法

    前言 在 asp.net core 中,存在着中间件这一概念,在中间件中,我们可以比过滤器更早的介入到 http 请求管道,从而实现对每一次的 http 请求.响应做切面处理,从而实现一些特殊的功能 在使用中间件时,我们经常实现的是鉴权.请求日志记录.全局异常处理等等这种非业务性的需求,而如果你有在 asp.net core 中使用过 swashbuckle(swagger).health check.mini profiler 等等这样的组件的话,你会发现,这些第三方的组件往往都提供了页面,允

  • 关于Vue-cli3烦人的eslint问题

    目录 Vue-cli3烦人的eslint - 如果选择了是 - 如果选择了否 Vue-cli3的eslint报错 解决方法 Vue-cli3烦人的eslint 在vue-cli选择生成的时候,有一个询问是否把插件配置文件写在package.json文件里 - 如果选择了是 打开package.json 就会有以下一段代码 "eslintConfig": { "root": true, "env": { "node": true

  • spring boot 下对JSON返回值去除null和空字段操作

    在开发过程中,我们需要统一返回前端json格式的数据,但有些接口的返回值存在 null或者""这种没有意义的字段. 不仅影响理解,还浪费带宽,这时我们可以统一做一下处理,不返回空字段,或者把NULL转成"",spring 内置的json处理框架是Jackson.我们可以对它配置一下达到目的 直接看代码,很简单. /** * 〈返回json空值去掉null和""〉 〈功能详细描述〉 * * @author gogym * @version 2017

随机推荐