精通 Spring Boot 系列 05

简介: 精通 Spring Boot 系列 05

阅读全文,约 10 分钟

这是江帅帅的第005篇原创

Spring Boot 处理 JSON 数据

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

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

1. 编辑 Book 类

public 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 方法
}

2. 编辑 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 数据。

3. 转换集合数据

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

@RequestMapping("/getBooks")
public List<Book> 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 数据返回到客户端。

4. 更换转换器

1)使用 Gson

Gson 是 Google 的开源 JSON 解析器,添加依赖的时候先要去除默认的 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>

在 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,效果如图:

2)使用 fastjson

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

 
<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.alibaba</groupId>
    <artifactId>fastjson</artifactId>
</dependency>

接着,添加 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,效果如图:

目录
相关文章
|
Java Spring 容器
什么是Spring Boot插件化开发?如何进行?
什么是Spring Boot插件化开发?如何进行?
620 0
|
5月前
|
存储 安全 Java
Spring Boot
【7月更文挑战第16天】Spring Boot
31 1
|
7月前
|
Java 数据库 Spring
精通 Spring Boot 系列 12
精通 Spring Boot 系列 12
42 0
|
7月前
|
Java 数据库连接 数据库
精通 Spring Boot 系列 13
精通 Spring Boot 系列 13
42 0
|
7月前
|
安全 Java 应用服务中间件
精通 Spring Boot 系列 03
精通 Spring Boot 系列 03
41 0
|
Cloud Native Java Go
《Spring Boot前世今生》
《Spring Boot前世今生》
60 0
|
存储 缓存 算法
Spring Boot 中的 ConcurrentMapCacheManager
Spring Boot 中的 ConcurrentMapCacheManager
|
存储 JSON 安全
Spring Boot 安全
1.概述 在后端来说,安全主要就是控制用户访问,让对应权限的用户能访问到对应的资源,主要是两点: 认证 授权 认证,确定是谁。 授权,核实权限。 每个安全框架其实都是为了实现这两点。 目前常用的实现方式有如下几种: token JWT oauth spring security 前三种是理念,最后一种是开箱即食的框架。 2.token 2.1.理论 token ,也叫“令牌”,是验证用户身份的凭证。token的组成具有随意性,能标识用户身份即可。
128 0
|
开发框架 Java 开发者
spring boot介绍
spring boot介绍
|
XML 监控 Java
初学Spring Boot 必须要知道的事
Spring Boot简介 Spring Boot 核心功能 Spring Boot的优缺点 SpringBoot 常用注解和原理
174 0