【Core】.net core 3.1 api 返回实体类数据存在null,导致小程序调用接口也直接显示了null,原来要这样设置才可

news2024/12/23 10:00:09

对接过API接口的小伙伴都知道,接口返回的Json格式数据,有些字段可能会出现null的情况,并且还是个字符串,直接显示在用户界面上给人感觉出bug了

文章目录

      • 【开发环境】
      • 【场景描述】
      • 【返回null值重现】
        • 1)创建新项目
        • 2)项目命名
        • 选择目标框架
        • 4)默认项目结构
        • 5)启动文件Startup
        • 6)创建一个实体类
        • 7)实体序列化
        • 8)默认情况运行效果
        • 9)设置可空类型
      • 【空值处理】
        • 1)安装插件
        • 2)设置自定义类
        • 3)启动类配置
      • 【空值处理效果】
        • 【温故而知新】

返回null值效果

在这里插入图片描述

【开发环境】

操作系统:win11 家庭版
开发工具:Visual Studio 2019
开发框架:.net core 5.0
接口模式:MVC(三层模式:ModelView Controller 模型-视图-控制器)

【场景描述】

在实际项目开发中,我们难免会遇到调用接口返回字段值为null的情况。
如果不做处理,那么直接显示在客户端,会给人一种不专业的感觉,这个也是开发人员需要特别注意的。

【返回null值重现】

以下创建一个.net core 5.0进行场景重现,由于core是功能配置化,
默认情况只添加了部分功能示例,比如:MVC属于独立模块,所以需要配置添加到容器里才能使用

1)创建新项目

选择创建项目的模板:Web应用程序(模型视图控制器)
用于创建包含ASP.NET Core MVC视图和控制器的ASP.NET Core应用程序的项目模板
在这里插入图片描述

2)项目命名

在这里插入图片描述

选择目标框架

在这里插入图片描述

4)默认项目结构

在这里插入图片描述

5)启动文件Startup

.net core 2.1和.net core 3.1的启动文件方法代码还是有区别的,MVC方法都换了,以下是.net core 3.1的启动代码

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // 配置MVC控制器视图
        services.AddControllersWithViews();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();
        
        // 配置MVC默认路由         
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

6)创建一个实体类

实体类内容,编号、姓名、年龄,三个字段

7)实体序列化

在这里插入图片描述

8)默认情况运行效果

从下图可以知道常用的值数据类型的默认值

编号类型名称默认值
1int整型0
2string字符串空值
3DateTime时间0000-01-01
4float单精度浮点值0.0
5double双精度浮点值0.0
6decimal精确值0.0
7bool布尔值false
在这里插入图片描述

9)设置可空类型

  • 从下图可知

字符串无需额外说明可空,默认就是可空类型在这里插入图片描述

  • 从下图可知
    在C#开发语言里,设置可空类型标识,是在关键词后面加一个问号后缀,设定可空类型后,所有值默认就是返回null值,到这里就重新了接口返回null值得情况,那么接下来就是解决如何处理这类null值,实际开发中避免不了会有空值null,但是又不能把null返回到客户端显示!
    在这里插入图片描述

【空值处理】

1)安装插件

Nuget搜索安装:Microsoft.AspNetCore.Mvc.NewtonsoftJson
注意版本选择,因为是.net core3.1所以需要选择对应3.1版本,否则会提示版本不一致的错误
在这里插入图片描述

2)设置自定义类

这里只针对字符串为null的情况进行处理
时间、布尔值、整型、浮点等数据类型,如果要处理,那么应该统一转换成字符串类型,然后和前端人员对接好即可

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;

namespace NullValue
{
    /// <summary>
    /// DefaultContractResolver,默认解析器类来源于Newtonsoft.Json.dll
    /// </summary>
    public class NullDefaultContractResolver : DefaultContractResolver
    {
        /// <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 NullValueProvider(c);
                return jsonProperty;
            }).ToList();
        }
    }

    /// <summary>
    /// IValueProvider,值处理类来源于Newtonsoft.Json.dll
    /// </summary>
    public class NullValueProvider : IValueProvider
    {
        // 反射变量
        private readonly PropertyInfo _propertyInfo;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="memberInfo"></param>
        public NullValueProvider(PropertyInfo propertyInfo)
        {
            _propertyInfo = propertyInfo;
        }

        /// <summary>
        /// 获取Value
        /// </summary>
        /// <param name="target"></param>
        /// <returns></returns>
        public object GetValue(object target)
        {
            var result = _propertyInfo.GetValue(target);

            // 整型
            if (_propertyInfo.PropertyType == typeof(int?) && result == null)
            {
                result = 0;
            }

            // 字符串
            if (_propertyInfo.PropertyType == typeof(string) && result == null)
            {
                result = string.Empty;
            }

            // 长整型
            if (_propertyInfo.PropertyType == typeof(long?) && result == null)
            {
                result = 0L;
            }

            // 时间
            if (_propertyInfo.PropertyType == typeof(DateTime?) && result == null)
            {
                result = DateTime.MinValue;
            }

            // 布尔值
            if (_propertyInfo.PropertyType == typeof(bool?) && result == null)
            {
                result = false;
            }

            return result;
        }

        /// <summary>
        /// 设置Value
        /// </summary>
        /// <param name="target"></param>
        /// <param name="value"></param>
        public void SetValue(object target, object value)
        {
            _propertyInfo.SetValue(target, value);
        }
    }
}

3)启动类配置

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        // 自定义返回值处理
        options.SerializerSettings.ContractResolver = new NullDefaultContractResolver();
    });
}

【空值处理效果】

在这里插入图片描述

【温故而知新】

下面简单整理下微软技术Core框架的特点

编号特点描述
1跨平台能够在 Windows、macOS 和 Linux 操作系统上运行
2)紧跟潮流,再不跨平台,市场份额就要被削减了
2部署灵活1)Docker容器上部署
2)IIS上部署
3)独立的托管程序运行
3兼容性.NET Core 通过 .NET Standard 与 .NET Framework、Xamarin 和 Mono 兼容
4开放源代码1).NET Core 平台是开放源代码,使用 MIT 和 Apache 2 许可证。.NET Core 是一个.NET Foundation 项目
2)这个也是个趋势,毕竟java一直以来都是开源,只有开源才能有更多优秀的开发者完善和改进功能,甚至是创新
5Microsoft 支持.NET Core 由 Microsoft该项目提供支持

每天进步一点点,要想成长和进步,只有不断的努力和尝试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

细讲TCP三次握手四次挥手(二)

TCP/IP 协议族 应用层 应用层( application-layer &#xff09;的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程&#xff08;进程&#xff1a;主机中正在运行的程序&#xff09;间的通信和交互的规则。 对于不同的网络应用需要不同的应用层协议…

基本放大器电路- (一)

运算放大器组成的电路五花八门&#xff0c;令人眼花瞭乱&#xff0c;是模拟电路中学习的重点。在分析它的工作原理时倘没有抓住核心&#xff0c;往往令人头大。为此本人特搜罗天下运放电路之应用&#xff0c;来个“庖丁解牛”&#xff0c;希望各位从事电路板维修的同行&#xf…

精讲rpc框架,这么讲不怕你不明白!

谈到rpc框架可能有点陌生感&#xff0c;但是如果换成框架语言Ocaml&#xff0c;大家一定不陌生。 众所周知&#xff0c;ocaml是一款专门做functional programming的一款软件&#xff0c;尤其是它的界面非常简洁&#xff0c;还是专门的server进行线上编写。 rpc框架和ocaml是什…

一篇就看懂的文件操作

文件操作1为什么使用文件我们前面学习结构体时&#xff0c;写了通讯录的程序&#xff0c;当通讯录运行起来的时候&#xff0c;可以给通讯录中增加、删除数据&#xff0c;此时数据是存放在内存中&#xff0c;当程序退出的时候&#xff0c;通讯录中的数据自然就不存在了&#xff…

【Java并发编程】 interrupt 方法详解

【Java并发编程】 interrupt 方法详解 文章目录【Java并发编程】 interrupt 方法详解1.介绍2.打断阻塞状态线程3.打断正常状态的线程4.两阶段终止模式5.打断 park 线程1.介绍 程序中&#xff0c;有些线程的终端需要外部干预&#xff0c;比如有线程存在while(true)循环&#xf…

值得拥有并收藏的 3个安卓/鸿蒙手机解锁软件

手机无论支持哪种操作系统&#xff0c;都占据了每个人口袋里的空间。随着大量移动设备的使用&#xff0c;搜索引擎上也出现了同样数量的查询&#xff0c;其中最常见的是提供安卓/鸿蒙屏幕锁定删除工具。由于安卓是当今最畅销的设备&#xff0c;我们的首要任务是为您提供最好的安…

矿山安全生产监测预警系统 opencv

矿山安全生产监测预警系统通过pythonopencv网络模型计算机视觉技术&#xff0c;对现场画面中人的不安全行为”、“物的不安全状态”、“环境的不安全因素”三方面出发进行实时监测&#xff0c;当监测到现场画面中人员未穿反光衣行为、明火烟雾、未穿安全帽行为、矿车掉道识别、…

【王道数据结构】第三章 | 栈和队列

目录 一、栈stack 基本概念 基本操作 存储结构​​​​​​​ 二、队列Queue 基本概念 队列的基本操作 存储结构 三、栈的应用 栈在括号匹配中的应用 栈在表达式求值中的应用​编辑 栈在递归中的应用 一、栈stack 基本概念 只允许在一端(栈顶top)进行插入或删除操…

大数据看全国疫情生活,北京、武汉已过疫情拐点

自2022年11月末&#xff0c;很多地区新冠病例数据呈现下降趋势&#xff0c;与实际感知有明显差异。2022年12月14日&#xff0c;国家疾控中心发布消息&#xff0c;核酸检测实行“愿检尽检”&#xff0c;不再公布无症状感染者数据。因此&#xff0c;网友们想要了解所在地和老家的…

python能做的100件事04 - python解析PDF

1. python常用pdf库 名称特点PyPDF2已不再维护&#xff0c;继任者PyPDF4 ,但很长时间没有更新了,能读不能写pdfrw能读不能写&#xff0c;但可以兼容ReportLab写ReportLab商业版的开源版本&#xff0c;能写不能读pikepdf能读不能写pdfplumber能读不能写PyMuPDF读写均可,基于GPL…

Vue面试题2

1&#xff1a;vue.js的两个核心是什么&#xff1f; 答:数据驱动和组件化。 2&#xff1a;vue生命周期钩子函数有哪些&#xff1f; 答:总共分为8个阶段创建前/后&#xff0c;载入前/后&#xff0c;更新前/后&#xff0c;销毁前/后 3&#xff1a;第一次页面加载会触发哪几个钩子…

C语言二维数组中:主次对角线求和,上下三角求和,杨辉三角,矩阵转置

p8 有些的结论需要直接记住 目录 矩阵转置 主对角线和次对角线 下三角 和上三角&#xff08;一般是让求和&#xff09; 下三角 上三角 杨辉三角 矩阵转置 不是方阵 需要用到第二个二维数组 b[i][j]a[i][j] 是方阵 方法1 借助第二个二维数组&#xff0c;同上 方…

C++基础-3函数

一、函数 1.概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码 而一个较大的程序&#xff0c;一般分为若干个代码块&#xff0c;每个模块实现特定的功能 2.定义 5个内容&#xff1a; ①返回值类型 ②函数名 ③参数列表 ④函…

力扣刷题记录——1287. 有序数组中出现次数超过25%的元素、1299. 将每个元素替换为右侧最大元素 、1413. 逐步求和得到正数的最小值

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——1287. 有序数组中出现次数超过25%的元素…

【vector的模拟实现】

目录 1 类的成员变量 2 常用成员函数和迭代器 3 增删查改 3.1 reverse 3.2 push_back 3.3 resize 3.4 insert && erase 4 默认成员函数 4.1 构造函数 4.2 拷贝构造 4.3 赋值运算符重载 4.4 析构函数 前面我们详细介绍了string类的使用&#xff0c;vector的…

关于 JSON 数据格式的完全使用指南

前言 本文将对 JSON 的语法、解析、序列化进行详细的说明&#xff0c;帮助大家掌握 JSON 的使用方式。 如果文中有不对、疑惑或者错字的地方&#xff0c;欢迎在评论区留言指正&#x1f33b; 一、JSON简介 在 JSON 之前&#xff0c;XML 曾经一度成为互联网上传输数据的事实标…

【论文阅读】【剪枝】Learning Efficient Convolutional Networks through Network Slimming

摘要 深度卷积神经网络&#xff08;CNN&#xff09;在许多实际应用中的部署在很大程度上受到其高计算成本的阻碍。在本文中&#xff0c;我们提出了一种新的神经网络学习方案&#xff0c;以同时1&#xff09;减小模型大小&#xff1b;2&#xff09; 减少运行时内存占用&…

Kali Linux- 社会工程及压力工具教程

在本章中&#xff0c;我们将了解 Kali Linux 中使用的社会工程工具。 文章目录社会工程Kali Linux - 压力工具SlowhttptestinvitefloodTHC-SSL-DOS总结社会工程 社会工程师工具包 &#xff08;SET&#xff09; 是一个专为社会工程设计的开源渗透测试框架。SET具有许多自定义攻…

第九章(12):STL之常用查找算法

文章目录前情回顾常用查找算法findfind_ifadjacent_findbinary_searchcountcount_if下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的智能制造专业学生&#xff0c;在学习C/C的路上会越走越远&#xff0c;后面不定期更新有关C/C语法&#xff0…

读懂用户之用户调研怎么做?(内附模板教程)

随着互联网的发展&#xff0c;不管是做产品设计、运营&#xff0c;还是市场推广&#xff0c;我们都需要思考的是“用户真正想要的是什么&#xff1f;”。这时候&#xff0c;用户调研的重要性就凸显出来了。 一、什么是用户调研 用户调研&#xff0c;指通过各种方式得到受访者的…