首页 > 其他分享 >.NET Core 处理 WebAPI JSON 返回烦人的null为空

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

时间:2024-08-27 15:48:54浏览次数:4  
标签:WebAPI Core null 默认值 JSON SerializerSettings 序列化 options 属性

前言

      项目开发中不管是前台还是后台都会遇到烦人的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格式统一化。

标签:WebAPI,Core,null,默认值,JSON,SerializerSettings,序列化,options,属性
From: https://www.cnblogs.com/lgx5/p/18382854

相关文章

  • Azure Function host.json 设置不起作用
    解决方案:https://github.com/Azure/azure-functions-servicebus-extension/issues/81#issuecomment-1139175220publicclassStartup:FunctionsStartup{publicoverridevoidConfigure(IFunctionsHostBuilderbuilder){vartempSer......
  • python如何通过Json路径返回Json响应对应的值例子解析
    在Python中,处理JSON数据通常使用标准库中的json模块来解析和操作JSON格式的数据。如果你想要通过JSON路径来获取JSON响应中的值,你可以使用第三方库,如jsonpath-ng,它允许你使用类似XPath的语法来查询JSON对象。首先,你需要安装jsonpath-ng库,可以使用pip来安装:pipinstalljs......
  • json格式化com.alibaba.fastjson.JSONException: not match : - =, info :错误
    com.alibaba.fastjson.JSONException:notmatch:-=,info:pos6,line1,column7{intro=全刚的大铁锤,name=巨大铁锤,stock=666}   atcom.alibaba.fastjson.parser.JSONLexerBase.nextTokenWithChar(JSONLexerBase.java:398)   atcom.alibaba.fastjson.......
  • 062 Finishing the Core Functionality
    示例index.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>VueBa......
  • 《欧洲卡车模拟2》游戏启动时闪退提示缺少Core_ets2mp.dll文件怎么解决?欧卡2游戏崩溃
    在玩《欧洲卡车模拟2》时,游戏启动时出现闪退,并提示缺少Core_ets2mp.dll文件,这着实令人困扰。玩家可以尝试重新安装游戏、更新驱动程序,或者从可靠来源获取该文件并正确放置,以解决这一问题。本篇将为大家带来《欧洲卡车模拟2》游戏启动时闪退提示缺少Core_ets2mp.dll文件怎么解决......
  • 使用try-convert将.NET Framework项目迁移到.NET Core
    try-convert 是一个命令行工具,它可以帮助开发者将.NETFramework项目迁移到.NETCore或.NET5/6/7(以及更高版本,取决于发布时的最新版本)。这是Microsoft官方提供的一个工具,旨在简化迁移过程,但请注意,它不会自动解决所有兼容性问题,因为它主要是帮助进行项目文件和配置文件......
  • C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
    前言C#/.NET/.NETCore技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NETCore领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿,推荐或自荐优质文章/项目/学习资源等。每......
  • net.sf.json.JSONObject 放入数组 坑
    publicstaticvoidmain(String[]args){com.google.gson.JsonObjectjsonObject=newcom.google.gson.JsonObject();jsonObject.addProperty("sss","[null]");com.google.gson.JsonArrayjsonArray=newcom.google.g......
  • Api中子类继承父类后,子类设置JsonIgnore失效的补救
    如publicclassPerson{publicstringName{get;set;}publicintAge{get;set;}}publicclassStudent:Person{publicstringGrade{get;set;}[Newtonsoft.Json.JsonIgnore]publicnewintAge{get;set;}}序列化Student,Age还是一......
  • Swift 中的影像魔术:Core Video 的高级应用
    标题:Swift中的影像魔术:CoreVideo的高级应用在Swift开发中,CoreVideo是Apple提供的一个强大的框架,用于处理高质量的视频内容。从实时视频滤镜到高级图像处理,CoreVideo为开发者提供了丰富的API来实现各种视觉效果。本文将详细介绍如何在Swift中使用CoreVideo......