SpringBoot 内置了jackson来完成JSON的序列化和反序列化操作。Jackson使用ObjectMapper类将POJO对象序列化成JSON字符串,也能将JSON字符串反序列化成POJO对象。
1.测试SpringBoot的Controller返回json.
编写UsersController,测试返回单个对象,序列和Map.
@RestController
@RequestMapping("users")
public class UsersController {
@RequestMapping("object") // 测试返回单个对象
public Users returnSingleUsers(){
Users user = new Users();
user.setUid(100);
user.setUsername("张三丰");
user.setPassword("123456");
return user;
}
//测试返回集合
@RequestMapping("list")
public List<Users> returnUsersList(){
List<Users> usersList = new ArrayList<Users>();
usersList.add(new Users(100,"zhangsan","123456"));
usersList.add(new Users(101,"lisi","123456"));
usersList.add(new Users(102,"wangwu","123456"));
return usersList;
}
//测试返回map
@RequestMapping("map")
public Map<String,Object> returnMap(){
Map<String,Object> map = new HashMap<String,Object>();
map.put("data",new Users(100,"zhangsan","123456"));
map.put("msg","作者信息");
map.put("code",200);
return map;
}
}
使用postman测试以上三个接口,返回结果如下:

但是对于,属性值为null时,默认返回字符串'null',例如:
public Map<String,Object> returnMap(){
Map<String,Object> map = new HashMap<String,Object>();
map.put("data",null); //测试一下,json对null值的一个默认处理。
map.put("msg","作者信息");
map.put("code",200);
return map;
}

2.配置jackson对null值的处理
在实际项目中,我们难免会遇到一些 null 值出现,我们转 json 时,是不希望有这些 null 出现的,比如 我们期望所有的 null 在转 json 时都变成 "" 这种空字符串,那怎么做呢?我们在config包下新建一个配置类,如下图:

package com.oracle.config;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.io.IOException;
/*
* 配置Json,让Jackson处理null值时,把null转换为空串。
*
* */
@Configuration
public class JsonConfiguration {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder){
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
//@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString("");
}
});
return objectMapper;
}
}
注意:要想使该配置类起作用,必须确定pom.xml中已经添加了解析配置类的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
再次测试返回Map的接口,效果如下:
