springboot返回前端对象null转为空字符串
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转为空字符串的更多相关文章
- C# 对象遍历 string类型 null转空字符串和去前后空格
using System; using System.Collections.Generic; namespace OA.Common.Extensions { /// <summary> ...
- SQLSERVER NULL和空字符串的区别 使用NULL是否节省空间
SQLSERVER NULL和空字符串的区别 使用NULL是否节省空间 这里只讨论字符串类型,int.datetime.text这些数据类型就不讨论了,因为是否节省空间是根据数据类型来定的 在写这篇文 ...
- MySQL中NULL与空字符串
一些刚刚接触MySQL的孩子,经常会错误的认为NULL与空字符串’ ’是相同的.这看似是一件不重要的事情,但是在MySQL中,这两者是完全不同的.NULL是指没有值,而”则表示值是存在的,只不过是个 ...
- PHP递归方式把一个数组里面的null转换为空字符串”的方法
在一些接口的调用中,直接查询数据库出来的字段可能为null字段,但是为了简便前端的判断,需要把null转换成空字符串'',这个时候就需要递归的方式进行.直接上代码如下: //递归方式把数组或字符串 n ...
- 关于StringUtils类isEmpty、isNotEmpty、isBlank、isNotBlank针对null、空字符串和空白字符(如空格、制表符)的区别
isEmpty | null | 空字符串("")|空白字符(空格.制表符)| | isEmpty | true | true | false | | isNotEmpty | f ...
- Django与SQL语言中——NULL与空字符串的区别
SQL有指定空值的独特方式,它把空值叫做NULL. Null在数据库中表示 不知道的数据,主要有3种意思: 1)知道数据存在,但不知道具体值. 2)不知道数据是否存在. 3)数据不存在. 在SQL中, ...
- mysql 判断null 和 空字符串
1.在mysql中null 不能使用任何运算符与其他字段或者变量(函数.存储过程)进行运算.若使用运算数据就可能会有问题. 2.对null 的判断: 创建一个user表:id 主健 name 可以为空 ...
- 【转】oracle中的NULL、''(空字符串)以及'_'(空格)
在Oracle中使用null,''(空字符串),'_'(空格)时,有没有遇到问题?产生疑惑? 1.NULL和''(空字符串)是一个意思 注:为了便于区分空字符串和空格,下面的示例均以'_'代表空格. ...
- Java知识点-判断null、空字符串和空格
Java知识点-判断null.空字符串和空格 // 判断headerKey是否为null,空字符串或者空格 if (headerKey != null && headerKey.len ...
- Oracle中Null与空字符串' '的区别
含义解释: 问:什么是NULL? 答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零. ORACLE允许任何一种数据类型的字段为空,除 ...
随机推荐
- 公司有两台电脑,却分给一个上网ip
解决办法,只限于本公司: 电脑a和电脑b 电脑a先用ip 6.21上网,之后将ip改为其它: 电脑b改为6.21 此时两台电脑都能上网了
- Vue scoped样式
scoped样式: 作用:让样式在局部生效,防止冲突 写法:<style scoped>
- orm中多表查询示例
record = session.query(OrderMain, OrderGoods).join(OrderMain, OrderMain.order_code == OrderGoods.ord ...
- K8s之Etcd的备份与恢复
ETCD简介 ETCD用于共享和配置服务发现的分布式,一致性的KV存储系统. ETCD是CoreOS公司发起的一个开源项目,授权协议为Apache. ETCD 存储 k8s 所有数据信息 ETCD 是 ...
- C++ MFC学习 (四)
对话框 创建MFC应用程序时,选择对话框 可使用向导创建对应的对话框的类 1 // MFC_Demo2Dlg.cpp : 实现文件 2 // 3 4 #include "stdafx.h&q ...
- 手算推导BP神经网络
一.神经元 下图的蓝色区域被称为一个"感知机"(Perceptron), 感知机是对信息进行编码.压缩.集成.融合的计算机智能接口系统. 说白了,就是在输入端输入X1~X7这7个输 ...
- Linux环境使用Docker安装SqlServer2017
系统环境: CentOS 7.6 64位(同样适用于Ubuntu) 安装步骤: 1.创建文件夹 /home/docker/sqlserver/mssql 2.下载镜像并用外部匿名卷挂载数据 $ doc ...
- vscode自定义工作目录
vscode作为目前最受欢迎的编辑器,一直用vscode,但是最近清理c盘,发现vscode的目录,插件和数据目录,占据了上G的空间,那么,如何自定义 vscode的工作目录和数据目录呢,这里参考了一 ...
- Nextjs Contentful GraphQL Vercel Edges
配置contentful 1. 创建免费账号 2. 根据提示进行操作, Content Model - 创建页面属性模板 (personalWebsite) content entry - 根据属 ...
- fastdfs虚拟机单机版搭建
说明:github搭建步骤:https://github.com/happyfish100/fastdfs/wiki#trackermkdir /home/dfs #创建数据存储目录 cd /usr/ ...