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

2025-05-29 0 21

前言

项目开发中不管是前台还是后台都会遇到烦人的null,数据库表中字段允许空值,则代码实体类中对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都为null,前台对应字段赋值需要做null值判断,怎么才能全局把null替换为空。

本文分享WebAPI接口服务统一返回null替换为空的方法。

一、分析问题

.NET Core中使用Newtonsoft.Json进行序列化,WebAPI接口返回格式通过Startup.cs类全局设置。想是否可以通过配置把null替换为空值?于是找到了Newtonsoft.Json在序列化和反序列化期间如何处理空值和默认值的属性,具体配置代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20
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、示例代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18
/*包含属性的默认值与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结果格式如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14
{

"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?、DateTime?等。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54
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代码里面修改,标记为红色的代码,如下所示:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
//配置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替换为空的效果,运行结果如下所示:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
{

"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内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!

原文链接:https://www.cnblogs.com/1312mn/p/14262985.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 .NET Core 处理 WebAPI JSON 返回烦人的null为空 https://www.kuaiidc.com/97796.html

相关文章

发表评论
暂无评论