1.1 什么是json

  • JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
  • json是目前主流的前后端数据传送方式,springmvc中使用消息转换器HttpMessageConverter对json的转换器提供了很好的支持。

1.2 jackson

1.2.1 jackson依赖添加
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
</dependency>

当我们使用springboot开发时,添加的web依赖中默认支持了jackson-databind作为json处理器,如下图

spring boot json取消转移 springboot json转换器_JSON

1.2.2 案例实现
  1. 实体类book
@Data
public class Book {
    private String name;
    private String author;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;
}
  1. BookContoller
@RestController
public class BookController {

    @GetMapping("/book")
    public Book book() {
        Book book = new Book();
        book.setName("三国演义");
        book.setAuthor("罗贯中");
        book.setBirthday(new Date());
        return book;
    }
}
  1. 页面展示

spring boot json取消转移 springboot json转换器_json_02

需要注意的是:这里日期通过在Book类中添加注解进行了格式化,这个有一定的缺点,如果我们有很多个类都需要日期格式化,这就比较烦琐了,于是我们有了新的解决方法。

1.2.3 自定义日期格式化

源码解析:
JacksonHttpMessageConvertersConfiguration类中部分源码:

@Bean
        @ConditionalOnMissingBean(
            value = {MappingJackson2HttpMessageConverter.class},
            ignoredType = {"org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter", "org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter"}
        )
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
            return new MappingJackson2HttpMessageConverter(objectMapper);
        }

根据这段源码可知:如果我们没有给JacksonHttpMessageConvertersConfiguration注入bean,那么他会自动给我们添加一个该类,如果我们想自己实现这个类,需自己另外实现该方法。

@Configuration
public class MyConfig {
    @Bean
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper om = new ObjectMapper();
        om.setDateFormat(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"));
        converter.setObjectMapper(om);
        return converter;
    }
}

但是我们又会发现这个方法中只是两行代码起到作用,那么我们是不是可以只写这两行代码来实现该功能呢?
再看下JacksonAutoConfiguration类中部分源码

@Bean
        @Primary
        @ConditionalOnMissingBean
        ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
            return builder.createXmlMapper(false).build();
        }

所以可以在写一个方法来给ObjectMapper 注入bean即可

@Bean
    ObjectMapper objectMapper() {
        ObjectMapper om = new ObjectMapper();
        om.setDateFormat(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"));
        return om;
    }

经过测试,以上两种方法都可以实现功能。

1.3 Gson

  • Gson是Google的一个开源JSON解析框架,使用Gson,需要先出去默认的jackson处理器,然后添加依赖。
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-databind</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
     <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
     </dependency>

同样的开发者可以自己定义相应的日期格式化

@Configuration
public class GsonConfig {

    @Bean
    GsonHttpMessageConverter gsonHttpMessageConverter() {
        GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
        GsonBuilder builder = new GsonBuilder();
        builder.setDateFormat("yyyy-MM-dd");
        Gson gson = builder.create();
        converter.setGson(gson);
        return converter;
    }

    @Bean
    Gson gson() {
        GsonBuilder builder = new GsonBuilder();
        builder.setDateFormat("yyyy/MM/dd");
        Gson gson = builder.create();
        return  gson;
    }
}

这里也可以使用两种方法实现,原理与jackson相似。

1.4 fastjson

  • fastjson是阿里巴巴的一个开源json解析框架,是目前解析速度最快的开源框架,不同于Gson,fastjson继承后不能够马上使用,开发者必须提供相应的HttpMessageeConverter后才可以使用。

1.添加依赖(同样需要去除jackson的依赖)

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

2.自定义提供一个FastJsonHttpMessageConverter

@Configuration
public class MyFastJsonConfig {
    @Bean
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setDateFormat("yyyy-MM-dd");
        converter.setFastJsonConfig(config);
        return converter;
    }
}

3.页面展示

spring boot json取消转移 springboot json转换器_JSON_03


乱码了,没有配置响应编码,这一点要注意!!!

在上述代码中添加一段代码

converter.setDefaultCharset(Charset.forName("utf-8")); //防止乱码

同时在application.properties中配置

spring.http.encoding.force-response=true

最后再次测试

spring boot json取消转移 springboot json转换器_json_04

乱码问题解决!