前言

      项目开发中不管是前台还是后台都会遇到烦人的null,数据库表中字段允许空值,则代码实体类中对应的字段类型为可空类型Nullable<>,如int"htmlcode">

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

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

3、解决方案

      需要自己写一个NullToEmptyStringResolver类,然后重写CamelCasePropertyNamesContractResolver,但是该方法只能解决string类型null→""的问题,对其他可空类型无效,比如:int"htmlcode">

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

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

RTX 5090要首发 性能要翻倍!三星展示GDDR7显存

三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。

首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。

据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。