目录


  • 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.总结

仅自己学习记录,如有错误,敬请谅解~,谢谢~~~