目录
- 1.前言
- 2.fastjson全局配置
- 3.jackson全局配置
- 4.返回Json格式效果展示
- 5.Json数据统一返回工具类完整代码
- 6.总结
1.前言
SpringBoot使用Json框架(fastjson与jackson),把Json数据格式化返回到前端页面,并对Json数据中为null值的数据,进行格式为""。
2.fastjson全局配置
fastjson全局配置有两种方式:
(1)新建类fastJsonConfig继承WebMvcConfigurationSupport,重写configureMessageConverters(),并获取FastJson配置实例,,通过该实例设置需要的参数信息,把承载参数信息的FastJson实例,添加至FastJson会话转换器实例中,就可以实现统一格式的转换,以及处理各种类型默认值转换、是否保留map集合中的null值等操作。如下:
/**
* created by on 2021/9/12
* 描述:SpringBoot使用fastjson返回Json统一格式
* 3种情况:处理返回Json数据null格式化为——""
*
* @author ZSAndroid implements WebMvcConfigurer
* @create 2021-09-12-23:10
*/
@Configuration
public class MyFastJsonConfig extends WebMvcConfigurationSupport {
/**
* 配置fastjson方式一:(map集合)保留非实体构造方法的null,构造方法中的null格式化为——""
* 配置fastjson方式二:在SpringBoot启动类中(@SpringBootApplication),注入Bean: HttpMessageConverters
* (list集合+单个对象实例) 中的null,均能够格式为——""
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//创建会话消息实例容器
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
//创建fastJson配置实例
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(
//全局修改日期格式,如果时间是data、时间戳类型,按照这种格式初始化时间 "yyyy-MM-dd HH:mm:ss"
SerializerFeature.WriteDateUseDateFormat,
// 保留 Map 空的字段
SerializerFeature.WriteMapNullValue,
// 将 String 类型的 null 转成""
SerializerFeature.WriteNullStringAsEmpty,
// 将 Number 类型的 null 转成 0
SerializerFeature.WriteNullNumberAsZero,
// 将 List 类型的 null 转成 []
SerializerFeature.WriteNullListAsEmpty,
// 将 Boolean 类型的 null 转成 false
SerializerFeature.WriteNullBooleanAsFalse,
// 避免循环引用
SerializerFeature.DisableCircularReferenceDetect,
//返回Json数据排版格式
SerializerFeature.PrettyFormat);
//按字段名称排序后输出-SerializerFeature.SortField
//设置配置实例
converter.setFastJsonConfig(config);
//设置默认编码方式
converter.setDefaultCharset(StandardCharsets.UTF_8);
//集合填入媒介类型
List<MediaType> mediaTypeList = new ArrayList<>();
// 解决中文乱码问题,相当于在 Controller 上的 @RequestMapping 中加了个属性 produces = "application/json"
mediaTypeList.add(MediaType.APPLICATION_JSON_UTF8);
//设置支持媒介——装载了解决中文乱码参数
converter.setSupportedMediaTypes(mediaTypeList);
//添加到会话中
converters.add(converter);
}
/**
* 例如:
* 测试代码:
* @RequestMapping("/map")
* public Map<String, Object> getMap() {
* Map<String, Object> map = new HashMap<>(3);
* User user = new User(1, "倪升武", null, new Date());
* map.put("作者信息", user);
* map.put("博客地址", "http://blog.itcodai.com");
* map.put(" map.put("粉丝数量", 4153);
* return map;
* }
* 返回结果示例一:
* {"code":"0","data":{"作者信息":{"createTime":"2021-09-13 09:39","id":1,"password":"","username":"倪升武"},"CSDN地址":null,"粉丝数量":4153,"博客地址":"http://blog.itcodai.com"},"msg":"操作成功!"}
* 返回结果示例二:
* {
* "code":"0",
* "data":{
* "作者信息":{
* "createTime":"2021-09-13 09:41",
* "id":1,
* "username":"倪升武"
* },
* "粉丝数量":4153,
* "博客地址":"http://blog.itcodai.com"
* },
* "msg":"操作成功!"
* }
*/
}
(2)SpringBoot启动类(@SpringBootApplication),注入Bean: HttpMessageConverters
/**
* 配置fastjson方式二:启动测试类中注入Bean: HttpMessageConverters
* 具体做法:不需要继承WebMvcConfigurerAdapter
* map集合、list集合、单个对象,三者有null,均不格式为——"",直接省略
* @return
*/
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
//1.需要定义一个convert转换消息的对象;
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//2:添加fastJson的配置信息;
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//3处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
//4.在convert中添加配置信息.
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
return new HttpMessageConverters(converter);
}
3.jackson全局配置
新建配置类JacksonConfig,并注解@Configuration,配置内容如下:
/**
* created by on 2021/9/12
* 描述:SpringBoot使用jackson返回Json统一格式: (map集合+list集合+单个对象实例)均能够格式null为""
* 不对Json样式进行排版
*
* @author ZSAndroid
* @create 2021-09-12-23:07
*/
@Configuration
public class JacksonConfig {
@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;
}
}
4.返回Json格式效果展示
此处只展示map效果图,单个对象,和list集合不做展示。测试接口如下:
@RestController
@RequestMapping("/json")
public class JsonController {
@RequestMapping("/user")
public JsonResult<User> getUser() {
User user= new User(1, null, "123456",new Date());
return new JsonResult<>(user,"User查询成功");
}
@RequestMapping("/list")
public JsonResult<List> getUserList() {
List<User> userList = new ArrayList<>();
User user1 = new User(1, null, "root",new Date());
User user2 = new User(2, "李四", "123456",new Date());
userList.add(user1);
userList.add(user2);
return new JsonResult<>(userList, "获取用户列表成功");
}
@RequestMapping("/map")
public JsonResult<Map> getMap() {
Map<String, Object> map = new HashMap<>(3);
User user = new User(1, "张松", null,new Date());
map.put("作者信息", user);
map.put("博客地址", "");
map.p map.put("粉丝数量", 1000000);
return new JsonResult<>(map);
}
}
访问localhost的map接口,返回Json数据如下:项目tomcat重定向443了,没有8080(http://localhost/json/map)
{
"code":"0",
"data":{
"作者信息":{
"createTime":"2021-09-13 13:49",
"id":1,
"password":"",
"username":"张松"
},
"粉丝数量":1000000,
"msg":"操作成功!"
}
5.Json数据统一返回工具类完整代码
package work.lpssfxy.www.xxxxxxxxxxxxxxxxxxx.utils;
import lombok.Data;
import java.util.Date;
/**
* created by on 2021/9/12
* 描述:封装Json数据返回统一格式
*
* @author ZSAndroid
* @create 2021-09-12-23:12
*/
@Data
public class JsonResult<T> {
private Date now= new Date();//生成时间
private T data;//数据内容
private String code;//状态码
private String msg;//提示消息
/**
* 若没有数据返回,默认状态码为 0,提示信息为“操作成功!”
*/
public JsonResult() {
this.code = "200";
this.msg = "操作成功!";
}
/**
* 若没有数据返回,可以人为指定状态码和提示信息
* @param code
* @param msg
*/
public JsonResult(String code, String msg) {
this.code = code;
this.msg = msg;
}
/**
* 有数据返回时,状态码为 200,默认提示信息为“操作成功!”
* @param data
*/
public JsonResult(T data) {
this.data = data;
this.code = "200";
this.msg = "操作成功!";
}
/**
* 有数据返回,状态码为 200,人为指定提示信息
* @param data
* @param msg
*/
public JsonResult(T data, String msg) {
this.data = data;
this.code = "200";
this.msg = msg;
}
}
6.总结
仅自己学习记录,如有错误,敬请谅解~,谢谢~~~