使用 android 開發的同學,可能對 Gson
更為了解,Gson
是谷歌官方推出的支持 JSON
-- Java Object
相互轉換的 Java
序列化/反序列化 庫,之前由於沒有用過,所以學習一下。
在 Spring Boot
中我們也可以是喲合那個 Gson
作為 json
處理。本章主要學習 Gson
的用法
我們在使用 Gson 的時候必須先移除 Spring 自帶的 jackson。
1 新建 Spring Boot Maven 示例工程項目
注意:本示例是用來 IDEA 開發工具(window、mac 通用)
File > New > Project
,如下圖選擇Spring Initializr
然后點擊 【Next】下一步- 填寫
GroupId
(包名)、Artifact
(項目名) 即可。點擊 下一步
groupId=com.fishpro
artifactId=gsondemo - 選擇依賴
Spring Web Starter
前面打鈎。 - 項目名設置為
spring-boot-study-gsondemo
.
2 配置 application.properties (或 application.yml)
設置一個啟動端口
server.port = 8089
2 引入第三方類庫 Gson
2.1 從 pom.xml 中移除 spring boot 自帶的 jackson
找到下面 spring-boot-study-gsondemo
下的 pom.xml
,去掉下面代碼
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
替換成如下代碼,其中 exclusions
表示排除。
<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 的繼承類實現一樣的功能 ,例如下面的功能,
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號上的少)