Spring Boot 整合 Gson 使用教程

使用 android 開發的同窗,可能對 Gson 更爲了解,Gson 是谷歌官方推出的支持 JSON -- Java Object 相互轉換的 Java 序列化/反序列化 庫,以前因爲沒有用過,因此學習一下。html

Spring Boot 中咱們也能夠是喲合那個 Gson 做爲 json 處理。本章主要學習 Gson 的用法java

咱們在使用 Gson 的時候必須先移除 Spring 自帶的 jackson。android

本項目源代碼下載git

1 新建 Spring Boot Maven 示例工程項目

注意:本示例是用來 IDEA 開發工具(window、mac 通用)github

  1. File > New > Project,以下圖選擇 Spring Initializr 而後點擊 【Next】下一步
  2. 填寫 GroupId(包名)、Artifact(項目名) 便可。點擊 下一步 groupId=com.fishpro
    artifactId=gsondemo
  3. 選擇依賴 Spring Web Starter 前面打鉤。
  4. 項目名設置爲 spring-boot-study-gsondemo.

2 配置 application.properties (或 application.yml)

設置一個啓動端口web

server.port = 8089

2 引入第三方類庫 Gson

2.1 從 pom.xml 中移除 spring boot 自帶的 jackson

找到下面 spring-boot-study-gsondemo 下的 pom.xml,去掉下面代碼spring

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

替換成以下代碼,其中 exclusions 表示排除。json

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

2.2 向 pom.xml 添加第三方庫 Gson

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

2.3 設置 Gson 爲 controller 的消息轉換器

注意這個步驟很重要,否則在 restcontroller 或 contoller 自動轉換 json 的時候不會使用 gson。瀏覽器

2.3.1 使用 @Configuration (推薦)

  • 在 gsondemo 下新建 package 名稱 config
  • 在 config 下新建 GsonConfig
package com.fishpro.gsondemo.config;

import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;

import java.util.ArrayList;
import java.util.Collection;

@Configuration
public class GsonConfig {
    @Bean
    public HttpMessageConverters customConverters() {

        Collection<HttpMessageConverter<?>> messageConverters = new ArrayList<>();

        GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter();
        messageConverters.add(gsonHttpMessageConverter);

        return new HttpMessageConverters(true, messageConverters);
    }
}

2.3.2 使用 WebMvcConfigurerAdapter 來配置

另外咱們也能夠經過配置 WebMvcConfigurerAdapter 的繼承類實現同樣的功能 ,例以下面的功能,bash

Configuration
@EnableWebMvc
public class Application extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter < ? >> converters) {
        GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter();
        converters.add(gsonHttpMessageConverter);
    }
}

3 編寫示例代碼

本章節目的是實現

  • 利用 Gson 替代 jackson 引擎。
  • 已知對象(對象多是多級的),如何轉化爲 json,在 controller 或 restcontroller 中如何返回 json
  • 已知 json 字符串如何轉化爲對象

咱們採用和 fastjson 、jackson 示例同樣的過程,感興趣的能夠看這篇【Spring Boot Json 之 Jackjson Fastjson】.

3.1 編寫實體類代碼

新建兩個實體類,用戶類、用戶地址類,他們的關係是父子關係

User(路徑 src/main/java/com/fishpro/gsondemo/dto/User.java)

public class User {
    private Integer userId;

    private String username;

    private List<Address> addresses;


    private Calendar created = new GregorianCalendar();


    public User(Integer userId,String username){
        this.userId=userId;
        this.username=username;
    }
    public User(Integer userId,String username,List<Address> addresses){
        this.userId=userId;
        this.username=username;
        this.addresses=addresses;
    }
    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public List<Address> getAddresses() {
        return addresses;
    }

    public void setAddresses(List<Address> addresses) {
        this.addresses = addresses;
    }

    public Calendar getCreated() {
        return created;
    }

    public void setCreated(Calendar created) {
        this.created = created;
    }
}

Address (路徑 src/main/java/com/fishpro/gsondemo/dto/Address.java)

public class Address {
    private String street;
    private String zipcode;
    private String mobile;

    public Address(String street,String zipcode,String mobile){
        this.street=street;
        this.zipcode=zipcode;
        this.mobile=mobile;
    }
    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getZipcode() {
        return zipcode;
    }

    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
}

3.2 控制層代碼

UserController (路徑 src/main/java/com/fishpro/gsondemo/controller/UserController.java)

@RequestMapping("/user")
@RestController
public class UserController {

    @GetMapping("/get")
    public User get(){
        List<Address> addressList=new ArrayList<>();
        addressList.add(new Address("江蘇省南京市玄武大道1000號","201001","1801989098"));
        addressList.add(new Address("江蘇省南京市玄武大道1001號","201001","1811989098"));
        User user = new User(1, "fishpro",addressList);
        return  user;
    }
}

3.3 查看使用 gson 轉化的 json 效果

運行 右鍵點擊 JsonApplication > Run JsonApplication 在瀏覽器中輸入 http://localhost:8089/user/get 系統直接返回了json格式,那麼 Spring Boot 中默認就是喲合那個了 Jackson 來處理。

{
	"userId": 1,
	"username": "fishpro",
	"addresses": [{
		"street": "江蘇省南京市玄武大道1000號",
		"zipcode": "201001",
		"mobile": "1801989098"
	}, {
		"street": "江蘇省南京市玄武大道1001號",
		"zipcode": "201001",
		"mobile": "1811989098"
	}],
	"created": "2019-08-13T14:40:50.901+0000"
}

3.4 gson 的經常使用操做

3.4.1 基礎類型解析

接上面 3.2 代碼繼續寫

@RequestMapping("/user")
@RestController
public class UserController {

    @GetMapping("/get")
    public User get(){

        List<Address> addressList=new ArrayList<>();
        addressList.add(new Address("江蘇省南京市玄武大道1000號","201001","1801989098"));
        addressList.add(new Address("江蘇省南京市玄武大道1001號","201001","1811989098"));
        User user = new User(1, "fishpro",addressList);


        //01 基本類型解析
        Gson gson = new Gson();
        int i = gson.fromJson("99", int.class); //100
        double d = gson.fromJson("\"99.99\"", double.class);  //99.99
        boolean b = gson.fromJson("true", boolean.class);     // true
        String str = gson.fromJson("String", String.class);   // String
        System.out.println("int 類型:"+i);
        System.out.println("double 類型:"+d);
        System.out.println("boolean 類型:"+b);
        System.out.println("String 類型:"+str); 

        return  user;
    }
}

3.4.2 實體對象轉 json 字符串

接上面 3.4.1 代碼繼續寫

@RequestMapping("/user")
@RestController
public class UserController {

    @GetMapping("/get")
    public User get(){

        List<Address> addressList=new ArrayList<>();
        addressList.add(new Address("江蘇省南京市玄武大道1000號","201001","1801989098"));
        addressList.add(new Address("江蘇省南京市玄武大道1001號","201001","1811989098"));
        User user = new User(1, "fishpro",addressList);


        //01 基本類型解析
        Gson gson = new Gson();
        int i = gson.fromJson("99", int.class); //100
        double d = gson.fromJson("\"99.99\"", double.class);  //99.99
        boolean b = gson.fromJson("true", boolean.class);     // true
        String str = gson.fromJson("String", String.class);   // String
        System.out.println("int 類型:"+i);
        System.out.println("double 類型:"+d);
        System.out.println("boolean 類型:"+b);
        System.out.println("String 類型:"+str);

        //02 實體對象轉 json str
        String rst=gson.toJson(user);
        System.out.println("實體對象轉:");
        System.out.println(rst);
 

        return  user;
    }
}

3.4.3 實體對象轉 json 字符串

接上面 3.4.2 代碼繼續寫

@RequestMapping("/user")
@RestController
public class UserController {

    @GetMapping("/get")
    public User get(){

        List<Address> addressList=new ArrayList<>();
        addressList.add(new Address("江蘇省南京市玄武大道1000號","201001","1801989098"));
        addressList.add(new Address("江蘇省南京市玄武大道1001號","201001","1811989098"));
        User user = new User(1, "fishpro",addressList);


        //01 基本類型解析
        Gson gson = new Gson();
        int i = gson.fromJson("99", int.class); //100
        double d = gson.fromJson("\"99.99\"", double.class);  //99.99
        boolean b = gson.fromJson("true", boolean.class);     // true
        String str = gson.fromJson("String", String.class);   // String
        System.out.println("int 類型:"+i);
        System.out.println("double 類型:"+d);
        System.out.println("boolean 類型:"+b);
        System.out.println("String 類型:"+str);

        //02 實體對象轉 json str
        String rst=gson.toJson(user);
        System.out.println("實體對象轉:");
        System.out.println(rst);

        //03 對象轉實體 json fromJson
        User user2 = gson.fromJson(rst, User.class);
        System.out.println("對象轉實體:");
        System.out.println(user2);

        return  user;
    }
}

最後輸出效果

類型:99
double 類型:99.99
boolean 類型:true
String 類型:String
實體對象轉:
{"userId":1,"username":"fishpro","addresses":[{"street":"江蘇省南京市玄武大道1000號","zipcode":"201001","mobile":"1801989098"},{"street":"江蘇省南京市玄武大道1001號","zipcode":"201001","mobile":"1811989098"}],"created":{"year":2020,"month":2,"dayOfMonth":17,"hourOfDay":22,"minute":38,"second":30},"updated":{"year":2020,"month":2,"dayOfMonth":17,"hourOfDay":22,"minute":38,"second":30}}
對象轉實體:
com.fishpro.gsondemo.dto.User@ca30ffa

本項目源代碼下載

本文參考


我的親愛的讀者,若是您有問題能夠聯繫我微信號 fishpro 或 qq號 502086 (qq號上的少)

相關文章
相關標籤/搜索