1
2 import com.fasterxml.jackson.core.JsonGenerator;
3 import com.fasterxml.jackson.core.JsonProcessingException;
4 import com.fasterxml.jackson.databind.BeanDescription;
5 import com.fasterxml.jackson.databind.JsonSerializer;
6 import com.fasterxml.jackson.databind.SerializationConfig;
7 import com.fasterxml.jackson.databind.SerializerProvider;
8 import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
9 import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
10 import org.apache.commons.lang3.StringUtils;
11 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
12
13 import java.io.IOException;
14 import java.util.Collection;
15 import java.util.List;
16
17
18 /**
19 * 使用官方自带的json格式类库,fastjson因为content type问题时不时控制台报错、无法直接返回二进制等问题
20 */
21 class JacksonHttpMessageConverter extends MappingJackson2HttpMessageConverter {
22
23 /**
24 * 处理数组类型的null值
25 */
26 public class NullArrayJsonSerializer extends JsonSerializer<Object> {
27
28 @Override
29 public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
30 if (value == null) {
31 jgen.writeStartArray();
32 jgen.writeEndArray();
33 }
34 }
35 }
36
37
38 /**
39 * 处理字符串类型的null值
40 */
41 public class NullStringJsonSerializer extends JsonSerializer<Object> {
42
43 @Override
44 public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
45 jsonGenerator.writeString(StringUtils.EMPTY);
46 }
47 }
48
49 /**
50 * 处理数字类型的null值
51 */
52 public class NullNumberJsonSerializer extends JsonSerializer<Object> {
53
54 @Override
55 public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
56 jsonGenerator.writeNumber(0);
57 }
58 }
59
60 /**
61 * 处理布尔类型的null值
62 */
63 public class NullBooleanJsonSerializer extends JsonSerializer<Object> {
64
65 @Override
66 public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
67 jsonGenerator.writeBoolean(false);
68 }
69 }
70
71
72 public class MyBeanSerializerModifier extends BeanSerializerModifier {
73
74
75 @Override
76 public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
77 //循环所有的beanPropertyWriter
78 for (Object beanProperty : beanProperties) {
79 BeanPropertyWriter writer = (BeanPropertyWriter) beanProperty;
80 //判断字段的类型,如果是array,list,set则注册nullSerializer
81 if (isArrayType(writer)) {
82 //给writer注册一个自己的nullSerializer
83 writer.assignNullSerializer(new NullArrayJsonSerializer());
84 } else if (isNumberType(writer)) {
85 writer.assignNullSerializer(new NullNumberJsonSerializer());
86 } else if (isBooleanType(writer)) {
87 writer.assignNullSerializer(new NullBooleanJsonSerializer());
88 } else if (isStringType(writer)) {
89 writer.assignNullSerializer(new NullStringJsonSerializer());
90 }
91 }
92 return beanProperties;
93 }
94
95 /**
96 * 是否是数组
97 */
98 private boolean isArrayType(BeanPropertyWriter writer) {
99 Class<?> clazz = writer.getType().getRawClass();
100 return clazz.isArray() || Collection.class.isAssignableFrom(clazz);
101 }
102
103 /**
104 * 是否是string
105 */
106 private boolean isStringType(BeanPropertyWriter writer) {
107 Class<?> clazz = writer.getType().getRawClass();
108 return CharSequence.class.isAssignableFrom(clazz) || Character.class.isAssignableFrom(clazz);
109 }
110
111
112 /**
113 * 是否是int
114 */
115 private boolean isNumberType(BeanPropertyWriter writer) {
116 Class<?> clazz = writer.getType().getRawClass();
117 return Number.class.isAssignableFrom(clazz);
118 }
119
120 /**
121 * 是否是boolean
122 */
123 private boolean isBooleanType(BeanPropertyWriter writer) {
124 Class<?> clazz = writer.getType().getRawClass();
125 return clazz.equals(Boolean.class);
126 }
127
128 }
129
130 JacksonHttpMessageConverter() {
131 getObjectMapper().setSerializerFactory(getObjectMapper().getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier()));
132 }
133
134 }

一定要在下面配置消息转换器,不然没效果

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(new JacksonHttpMessageConverter());
} }

如果想要更丰富的可以在:MyBeanSerializerModifier中自定义。

原文: https://blog.csdn.net/qq_38132283/article/details/89339817?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-15.baidujs&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-15.baidujs

springboot返回前端对象null转为空字符串的更多相关文章

  1. C# 对象遍历 string类型 null转空字符串和去前后空格

    using System; using System.Collections.Generic; namespace OA.Common.Extensions { /// <summary> ...

  2. SQLSERVER NULL和空字符串的区别 使用NULL是否节省空间

    SQLSERVER NULL和空字符串的区别 使用NULL是否节省空间 这里只讨论字符串类型,int.datetime.text这些数据类型就不讨论了,因为是否节省空间是根据数据类型来定的 在写这篇文 ...

  3. MySQL中NULL与空字符串

    一些刚刚接触MySQL的孩子,经常会错误的认为NULL与空字符串’  ’是相同的.这看似是一件不重要的事情,但是在MySQL中,这两者是完全不同的.NULL是指没有值,而”则表示值是存在的,只不过是个 ...

  4. PHP递归方式把一个数组里面的null转换为空字符串”的方法

    在一些接口的调用中,直接查询数据库出来的字段可能为null字段,但是为了简便前端的判断,需要把null转换成空字符串'',这个时候就需要递归的方式进行.直接上代码如下: //递归方式把数组或字符串 n ...

  5. 关于StringUtils类isEmpty、isNotEmpty、isBlank、isNotBlank针对null、空字符串和空白字符(如空格、制表符)的区别

    isEmpty | null | 空字符串("")|空白字符(空格.制表符)| | isEmpty | true | true | false | | isNotEmpty | f ...

  6. Django与SQL语言中——NULL与空字符串的区别

    SQL有指定空值的独特方式,它把空值叫做NULL. Null在数据库中表示 不知道的数据,主要有3种意思: 1)知道数据存在,但不知道具体值. 2)不知道数据是否存在. 3)数据不存在. 在SQL中, ...

  7. mysql 判断null 和 空字符串

    1.在mysql中null 不能使用任何运算符与其他字段或者变量(函数.存储过程)进行运算.若使用运算数据就可能会有问题. 2.对null 的判断: 创建一个user表:id 主健 name 可以为空 ...

  8. 【转】oracle中的NULL、''(空字符串)以及'_'(空格)

    在Oracle中使用null,''(空字符串),'_'(空格)时,有没有遇到问题?产生疑惑? 1.NULL和''(空字符串)是一个意思 注:为了便于区分空字符串和空格,下面的示例均以'_'代表空格. ...

  9. Java知识点-判断null、空字符串和空格

    Java知识点-判断null.空字符串和空格 // 判断headerKey是否为null,空字符串或者空格 if (headerKey != null && headerKey.len ...

  10. Oracle中Null与空字符串' '的区别

    含义解释: 问:什么是NULL? 答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零. ORACLE允许任何一种数据类型的字段为空,除 ...

随机推荐

  1. CRM管理系统界面

  2. wibu软授权(五)

    本篇将尝试根据RAU的asn1定义手动生成一份自定义的RAU文件,看看能不能通过wibu软授权系统的验证 准备工具 python3 asn1tools Ubuntu 18.04 CodeMeter R ...

  3. (前端面试题)详解 JS 的 setTimeout 和 setInterval 两大定时器

    程序员面试题库分享 1.前端面试题库 (面试必备)            推荐:★★★★★ 地址:前端面试题库 2.前端技术导航大全      推荐:★★★★★ 地址:前端技术导航大全 3.开发者颜色 ...

  4. vue 项目引入 jquery

    一.引入 jquery 1. 方式一 默认会安装最新版本 jquery npm install jquery 2. 方式二 指定版本 npm install jquery@3.6.0 3. 方式三 在 ...

  5. 《CSOL大灾变》开发记录——武器购买逻辑开发

    上次完成了武器购买界面设计,这次来完成武器购买逻辑与武器选择逻辑. 武器购买逻辑分为两个部分,一个部分是GUI部分的逻辑,也就是购买菜单,一个是武器游戏数据更新的逻辑,也就是实际中玩家获取武器的逻辑开 ...

  6. Mysql主从备份指定库别名

    问题:replicate-rewrite-db  不生效 解决方案: 尝试 注释掉 replicate-do-db ,不写 replicate-ignore-db,只写 replicate-rewri ...

  7. 在Github上搭建个人主页

    最近试着在github上搭建个人主页,没用github给的模板,用的是自己在网上找到那种类似个人主页的模板,到时候直接上传到仓库里就行了 首先先创建仓库,点击右上角的加号,选择New reposito ...

  8. .net core layui折叠表格的应用。

    效果展示 头部的折叠,展开,搜索按钮 <div class="layui-fluid"> <div style="margin-top: 20px;&q ...

  9. python菜鸟学习: 12. 装饰器的中级用法

    # -*- coding: utf-8 -*-username = "liyuzhoupan"password = "123"def author(wrappr ...

  10. Firefox彻底禁用自动更新提示

    实验版本:96 安装目录下新建文件夹:distribution 新建文件:policies.json 文件内容为: { "policies": { "DisableApp ...