江帅帅:精通 Spring Boot 系列 05

简介: JSON 是目前主流的前后端数据传输方式,当 Controller 中返回的是一个 Java 对象或 List 集合时,Spring Boot 将自动把它转换成 JSON 数据。

Spring Boot 处理 JSON 数据
JSON 是目前主流的前后端数据传输方式,当 Controller 中返回的是一个 Java 对象或 List 集合时,Spring Boot 将自动把它转换成 JSON 数据。

Spring Boot 中内置了 JSON 解析功能,当你在项目中,添加了 spring-boot-starter-web 模块之后,即可看到默认包含 Jackson 解析器,也可以换成 Fastjson 等其他解析器。

  1. 编辑 Book 类
  2. class Book {
private Integer id;
private String name;
private String author;
@JsonIgnore
private Float price;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date bookPublicationDate;

// getter 和 setter 方法

}

  1. 编辑 BookController
    返回数据的时候,需要使用 @ResponseBody 注解。如果经常使用 @Controller 和 @ResponseBody 注解,则可以使用 @RestController 组合注解来替代。

@RestController
public class BookController {

@GetMapping("/book")
public Book book(){
    Book book = new Book();
    book.setId(1);
    book.setName("《码农翻身:用故事给技术加点料》");
    book.setAuthor("刘欣");
    book.setPrice(69f);
    book.setBookPublicationDate(new Date());

    return book;
}

}
运行之后,直接地址栏中访问 http://localhost:8080/book,即可看到返回的 JSON 数据。

1.jpg

  1. 转换集合数据
    添加 getBooks() 方法,创建一个 List 集合,存放三本书。具体源码如下:

@RequestMapping("/getBooks")
public List getBooks() {

List<Book> bookList = new ArrayList<>();

Book book1 = new Book();
book1.setId(1);
book1.setName("《码农翻身:用故事给技术加点料》");
book1.setAuthor("刘欣");
book1.setPrice(69f);
book1.setBookPublicationDate(new Date());

Book book2 = new Book();
book2.setId(2);
book2.setName("《漫画算法:小灰的算法之旅(全彩)》");
book2.setAuthor("魏梦舒");
book2.setPrice(79f);
book2.setBookPublicationDate(new Date());

Book book3 = new Book();
book3.setId(3);
book3.setName("《未来架构》");
book3.setAuthor("张亮");
book3.setPrice(99f);
book3.setBookPublicationDate(new Date());

bookList.add(book1);
bookList.add(book2);
bookList.add(book3);

return bookList;

}
运行之后,直接地址栏中访问 http://localhost:8080/getBooks,即可看到 getBooks() 方法创建多个 Book 对象封装在 List 集合中并将 JSON 数据返回到客户端。

2.jpg

  1. 更换转换器
    1)使用 Gson

Gson 是 Google 的开源 JSON 解析器,添加依赖的时候先要去除默认的 jackson,具体如下:

<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>

<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>


在 Gson 转换时,如果需要格式化日期数据,则需要自定义 HttpMessageConverter,接着提供一个 GsonHttpMessageConverter 即可,具体如下:

@Configuration
public class GsonConfig {

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

    return converter;
}

}
修改 Book 类,具体如下:

public class Book {

private Integer id;
private String name;
private String author;
protected Float price;
private Date bookPublicationDate;

// getter 和 setter 方法

}
运行之后,直接地址栏中访问 http://localhost:8080/getBooks,效果如图:

3.jpg

2)使用 fastjson
fastjson 是阿里巴巴的开源 JSON 解析器,也是目前速度最快的 JSON 解析器,整合之后需要提供相应的 HttpMessageConverter 才能使用,添加依赖,具体如下:

<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>

<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>


接着,添加 fastjson 的 HttpMessageConverter,具体如下:

@Configuration
public class NXFastJsonConfig {

@Bean
FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
    FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
    FastJsonConfig config = new FastJsonConfig();
    config.setDateFormat("yyyy-MM-dd");
    config.setCharset(Charset.forName("UTF-8"));
    config.setSerializerFeatures(
            SerializerFeature.WriteClassName,
            SerializerFeature.WriteMapNullValue,
            SerializerFeature.PrettyFormat,
            SerializerFeature.WriteNullListAsEmpty,
            SerializerFeature.WriteNullStringAsEmpty
    );
    converter.setFastJsonConfig(config);
    return converter;
}

}
再来 application.properties 中配置一个响应编码,具体如下:

spring.http.encoding.force-response=true
运行之后,直接地址栏中访问 http://localhost:8080/getBooks,效果如图:

4.jpg
本文来源于:奈学开发者社区-江帅帅

相关文章
|
27天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
40 0
|
6天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
24 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
8天前
|
XML Java C++
【Spring系列】Sping VS Sping Boot区别与联系
【4月更文挑战第2天】Spring系列第一课:Spring Boot 能力介绍及简单实践
【Spring系列】Sping VS Sping Boot区别与联系
|
2月前
|
XML 监控 druid
【Java专题_02】springboot+mybatis+pagehelper分页插件+druid数据源详细教程
【Java专题_02】springboot+mybatis+pagehelper分页插件+druid数据源详细教程
|
3月前
|
Java
springboot项目打包瘦身
springboot项目打包瘦身
|
5月前
|
Java 测试技术
Springboot集成JUnit5优雅进行单元测试
Springboot集成JUnit5优雅进行单元测试
|
9月前
|
Java Maven
【Springboot】创建boot工程spring-boot-maven-plugin报红、出错_解决方案
【Springboot】创建boot工程spring-boot-maven-plugin报红、出错_解决方案
317 0
|
9月前
|
SQL druid 前端开发
让SpringBoot不需要Controller、Service、DAO、Mapper,卧槽!这款工具绝了!
让SpringBoot不需要Controller、Service、DAO、Mapper,卧槽!这款工具绝了!
|
11月前
|
Java C++ Spring
Spring Boot - ConfigDataEnvironmentPostProcessor(Boot 2.4)搞定配置文件加载优先级
Spring Boot - ConfigDataEnvironmentPostProcessor(Boot 2.4)搞定配置文件加载优先级
236 0
|
Java Spring
Spring Cloud版本冲突(java.lang.NoClassDefFoundError:org/springframework/boot/Bootstrapper)
Spring Cloud版本冲突(java.lang.NoClassDefFoundError:org/springframework/boot/Bootstrapper)
94 0
Spring Cloud版本冲突(java.lang.NoClassDefFoundError:org/springframework/boot/Bootstrapper)