zoukankan      html  css  js  c++  java
  • Spring Boot 整合 Gson 使用教程

    使用 android 开发的同学,可能对 Gson 更为了解,Gson 是谷歌官方推出的支持 JSON -- Java Object 相互转换的 Java 序列化/反序列化 库,之前由于没有用过,所以学习一下。

    Spring Boot 中我们也可以是哟合那个 Gson 作为 json 处理。本章主要学习 Gson 的用法

    我们在使用 Gson 的时候必须先移除 Spring 自带的 jackson。

    本项目源代码下载

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

    注意:本示例是用来 IDEA 开发工具(window、mac 通用)

    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)

    设置一个启动端口

    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号上的少)

  • 相关阅读:
    环境是如何建立的 启动文件有什么
    环境中存储的是什么
    串行 并行 异步 同步
    TPC-H is a Decision Support Benchmark
    进程通信类型 管道是Linux支持的最初Unix IPC形式之一 命名管道 匿名管道
    删除环境变量
    14.3.2.2 autocommit, Commit, and Rollback 自动提交 提交和回滚
    14.3.2.2 autocommit, Commit, and Rollback 自动提交 提交和回滚
    14.3.2.1 Transaction Isolation Levels 事务隔离级别
    14.3.2.1 Transaction Isolation Levels 事务隔离级别
  • 原文地址:https://www.cnblogs.com/fishpro/p/spring-boot-gson.html
Copyright © 2011-2022 走看看