Spring Boot 2.x 实践记:Gson

Posted mickjoust

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 2.x 实践记:Gson相关的知识,希望对你有一定的参考价值。

目录

  • 1、Gson 依赖
  • 2、Gson自动配置
  • 3、配置Gson为首选JSON映射器
  • 4、完全排除Jackson
  • 5、实战
  • 6、测试
  • 7、小结

TL;DR

本文,我们一起来实践使用Gson作为首选的json映射器,替换Spring Boot默认的Jackson。

1. Gson依赖

<dependencies>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.5</version>
    </dependency>
</dependencies>

2. Gson自动配置

Spring Boot 自动支持Gson,会在启动时去搜索是否有gson的类,并通过自动配置来创建一个Gson的默认值的bean。

2.1. Gson Bean

Spring Boot 如果检测到存在Gson.class类存在,便会使用GsonAutoConfiguration来配置Gson Bean实例。

我们可以直接使用自动装配的spring bean,如下:

@Resource
private Gson gson;

2.2. 自定义 Gson Bean

为了自定义Gson实例的默认行为,我们可以从下面的列表中配置相应的属性。

# 序列化日期对象时使用的格式
spring.gson.date-format= 
 
# 是否禁用html的转义字符(比如'<','>'等)
spring.gson.disable-html-escaping= 
 
# 序列化时是否排除内部类
spring.gson.disable-inner-class-serialization= 
 
# 序列化时是否启用复杂映射键
spring.gson.enable-complex-map-key-serialization= 
 
# 序列化或反序列化时是否排除所有没有“@Expose”注解的字段。
spring.gson.exclude-fields-without-expose-annotation= 
 
# 序列化时应用于对象字段的命名策略
spring.gson.field-naming-policy= 
 
# 是否在输出之前添加一些特殊文本来生成不可执行的JSON
spring.gson.generate-non-executable-json= 
 
# 是否放宽解析不符合RFC 4627的JSON
spring.gson.lenient= 
 
# Long类型的序列化策略
spring.gson.long-serialization-policy= 
 
# 序列化时是否输出经过美化后格式的JSON
spring.gson.pretty-printing= 
 
# 是否序列化空字段(null)
spring.gson.serialize-nulls= 

3. 配置Gson为首选JSON映射器

application.properties文件中使用此如下配置属性:

spring.http.converters.preferred-json-mapper=gson

4. 完全排除Jackson

我们都知道Spring Boot 2 默认的JSON映射器是Jackson。如果想从应用中完全排除Jackson,可以通过排除 spring-boot-starter-json 依赖来实现。

4.1. 从项目依赖项中排除Jackson

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 排除默认 Jackson 依赖 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4.2. 禁用自动配置

如果只想在Spring Boot配置中排除Jackson,可以通过禁用自动配置类JacksonAutoConfiguration 来排除它。

@SpringBootApplication(exclude = JacksonAutoConfiguration.class)
public class AppStartJson 
    ... ...

5. 实战

  • github代码地址:

5.1. 创建Spring Boot启动类

通过 start.spring.io/ 创建项目,添加启动类 AppStartJson 类。

package com.mickjoust.demo.springboot2_in_action.json;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;

/**
 * @author mickjoust
 **/
@SpringBootApplication(exclude = JacksonAutoConfiguration.class)
public class AppStartJson 
    public static void main(String[] args) 
        SpringApplication.run(AppStartJson.class,args);
    

5.2. 创建Restful API

我们模拟一个简单的Json 序列化和反序列化的例子。

package com.mickjoust.demo.springboot2_in_action.json.gson;

import com.google.gson.Gson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author mickjoust
 **/
@RestController
public class TestGsonController 

    @PostMapping(value = "/gson")
    public String gson(@RequestBody TestGson testGson)
        Gson gson = new Gson();
        List<String> stringList = new ArrayList<>();
        stringList.add("Mick");
        stringList.add("Spike");
        stringList.add("Mia");
        stringList.add("Max");
        testGson.setFriends(stringList);
        Map<String,Object> map = new HashMap<>();
        map.put("test1",123);
        map.put("test2","123");
        map.put("test3",123L);
        testGson.setData(map);

        System.out.println(gson.toJson(testGson));
        return gson.toJson(testGson);
    

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    static class TestGson 
        private String name;
        private Integer age;
        private List<String> friends;
        private Map<String,Object> data;
    


6. 测试

使用postman来模拟测试序列化和反序列化场景,:

  • 输入一个简单的json作为对象,再将对象增加值后并响应返回json。

7. 小结

到此,在Spring Boot 2中使用Gson便完成。

以上是关于Spring Boot 2.x 实践记:Gson的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2.x 实践记:Gson

(汇总)Spring Boot 实践折腾记 & Spring Boot 2.x 实践记

Spring Boot 2.x 实践记:Mail

Spring Boot 2.x 实践记:Mail

Spring Boot 2.x 实践记:Mail

Spring Boot 2.x 实践记:@SpringBootTest