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

  • 相关阅读:
    Java:字符分割
    Java 线程池:newFixedThreadPool
    人类有限的自制力是相当脆弱的
    Arcgis模型构建器案例教程while和for实现通用的循环迭代功能
    通用化全功能、可视化搭建式、扁平化流线型、无代码零基础、探索式启发法、案例式现场化的ArcGIS模型构建器教程教材培训
    Arcgis模型构建器案例教程——while循环递归查找所有相邻的要素
    广西崇左市各地建成区排名最小是大新县
    Arcgis地理处理工具案例教程——批量修改坐标系
    Arcgis模型构建器可视化编程案例教程添加要素个数到文件名,要素类是否为空,删除空白要素类数据文件,删除工作空间里的空白数据文件
    Arcgis地理处理工具案例教程——多边形图层的最小覆盖范围边界
  • 原文地址:https://www.cnblogs.com/fishpro/p/spring-boot-gson.html
Copyright © 2020-2023  润新知