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. sqlserver 行转列 列转行

    行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过了,却没有系统性的认识和 ...

  2. ROS1 Qt5 CMake基本配置

    ############################################################################## # CMake ############# ...

  3. []Linux 离线升级Openssh与Openssl版本

    https://blog.csdn.net/qq_45728838/article/details/120825845 离线的意思是为Linux无法链接网络,只能通过windows 将文件上传一.首先 ...

  4. [学习计划]mysql常用语句-随学随整理

    <>   不等于 三元表达式 select *, if (num=1, "第一", "其他") as 别名 from 表 COUNT 统计总数并按某 ...

  5. shell脚本自动过滤尝试多次连接ip并添加到系统黑名单

    #!/bin/bash cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c | awk '{{ print $2 " ...

  6. vim 小记录

    将str1批量替换成str2 , 特殊符号前用转译符 \ :%s/str1/str2/g

  7. 蓝牙mesh组网实践(mesh组网的评估与沁恒蓝牙芯片选型)

    目录 沁恒的组网方式主要有2.4G私有协议组网和BLE mesh组网两大类.2.4G私有协议组网灵活性相对较高,对开发者的要求也相对较高.mesh组网本身有一系列规范,考虑到了可靠性.安全性.功能性等 ...

  8. composer 换源

    #首先把默认的源给禁用掉 composer config -g secure-http false #再修改镜像源 这里我使用阿里的源 composer config -g repo.packagis ...

  9. docker容器部署flask单页面应用

    本地安装docker,拉取centos镜像. docker pull centos:7 本地文件结构: /usr/local/var/tmp/docker_demo .app ---requireme ...

  10. 【Linux】常用

    查看端口占用 yum install lsof lsof -i:8080:查看8080端口占用 lsof abc.txt:显示开启文件abc.txt的进程 lsof -c abc:显示abc进程现在打 ...