返回JSON数据

默认实现

Json是目前主流的前后端数据传输方式,SptringMVC中使用消息转换器HttpMessageConverter对JSON的转换提供了很好的支持,在SpringBoot中更进一步,对相关的配置做了简化。默认情况下,当开发者新创建一个SpringBoot项目后,添加web依赖,这个依赖默认加入了jackson-databind作为JSON处理器,此时不需要添加额外的JSON处理器就能返回一段JSON了。

HttpMessageConverter,看名字就知道,这是一个消息装换工具,有两个方面的功能:

  1. 将服务端返回的对象序列化成JSON字符串
  2. 将前端传来的JSON字符串反序列化成Jason对象

所有的JSON对象都离不开相关的HttpMessageConverter

SpringMVC自动配置了Jackson和Gson的HttpMessageConverter,SpringBoot中又对此做了自动化配置

  1. org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration
  2. org.springframework.http.converter.json.GsonHttpMessageConverter

所以用户使用Jackson和Gson的话,没有其他额外配置,则只需要添加依赖即可

使用Jackson

bean

public class User {
    private Integer id;
    private String username;
    private String address;
    private Date birthday;
...
}

controller

@RestController
public class UserController {
    @GetMapping("users")
    public List<User> getAllUser(){
        List<User> users = new ArrayList<User>();

        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setId(i);
            user.setUsername("java技术"+i);
            user.setAddress("www.qwl.com"+i);
            user.setBirthday(new Date());
            users.add(user);
        }
        return users;
    }
}

运行结果

自定义转换器

可以看出我们重写MappingJackson2XmlHttpMessageConverter

@Configuration
public class WebMvcConfig {

    @Bean
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){
        MappingJackson2HttpMessageConverter converter =
                new MappingJackson2HttpMessageConverter();
        ObjectMapper om = new ObjectMapper();
        om.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
        converter.setObjectMapper(om);
        return converter;
    }
}

运行

从上面可以知道起关键作用的是ObjectMapper

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

运行一样起作用

使用Gson

排除jackson,添加Gson

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
</dependency>
@Configuration
public class WebMvcConfig {

    @Bean
    GsonHttpMessageConverter gsonHttpMessageConverter(){
        GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
        converter.setGson(new GsonBuilder().setDateFormat("yyyy/MM/dd").create());
        return converter;

    }
}

或者

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

使用fastjson

fastjson 是阿里巴巴的一个开源JSON 解析框架, 是目前JSON 解析速度最快的开源框架,该框架也可以集成到Spring Boot 中。不同于Gson, fastjson 继承完成之后并不能立马使用, 需要开
发者提供相应的HttpMessageConverter 后才能使用,集成fastjson 的步骤如下。
首先除去j ackson-databind 依赖,引入fastjson 依赖:

然后配置fastjson的HttpMessageConverter:

代码解释:

  • 自定义MyFastJsonConfig,完成对FastJsonHttpMessageConverter Bean的提供。
  • 第7~ 15 行分别配直了JSON 解析过程的一些细节,例如日期格式、数据编码、是否在生成的JSON 中输出类名、是否输出value 为null 的数据、生成的JSON 格式化、空集合输出口而非null 、空字符串输出“”而非null 等基本配置。
    MyFastJsonConfig 配置完成后,还需要配置一下响应编码,否则返回的JSON 中文会乱码,在application.properties中添加如下配置:
spring.http.encoding.force-response=true

接下来提供BookController 进行测试。

posted @ 2020-08-05 20:14  柒丶月  阅读(922)  评论(0编辑  收藏  举报