• Gson使用方法详解


    一、概述

      Gson是google提供的用来操作json数据的一个非常好用的类库。其使用范围非常的广泛,所以非常有必要对其进行系统的学习。

      json是一种数据格式,确切的说是一种文本数据格式。其在网络通讯过程中的作用非常的明显。
      目前大多数的网络通讯格式已经从xml替换为json格式。
      其提供了序列化和反序列化的功能。在我们进行网络开发的过程中通常会把参数封装成json格式传给后台,后台解析后的返回结果也会封装成json格式返回给调用者。
      下面就针对json的用法做一下详细的描述。ps:重要。在查看第三方库的源代码或者自己封装库的时候尤其重要。对json不熟悉是无法封装成基于json的高质量库的。
      例如:Retrofit的网络数据转换的converter。GsonConverterFactory.create()

    二、从小例子入手

      ps:Book.java

      下面用到的所有实体都是基于Book.java类的。代码如下:

    package com.yw.gsonlib;
    
    import com.google.gson.annotations.SerializedName;
    
    /**
     * create by yangwei
     * on 2020-02-21 18:08
     */
    public class Book {
        public Book(){}
        private String id;
        /**
         * 加上@SerializedName注解后服务端api返回name、bookName、Name、bn时,客户端都能够拿到正确的值给name属性。
         */
        @SerializedName(value = "bookName",alternate = {"Name","bn"})
        private String name;
    
        public Book(String id, String name) {
            this.id = id;
            this.name = name;
    
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

      

      1.如何创建一个Gson对象

       /**
         * 创建Gson对象的两种形式
         */
        private void createGsonObject() {
            //第一种方式
            Gson gson = new Gson();
            //第二种方式
            Gson gson1 = new GsonBuilder().create();
            //方式二除了可以创建一个Gson对象以外还可以进行多项配置,例如,设置日期的格式化
    //       例如: new GsonBuilder().setDateFormat("yyyy-MM-dd");
        }
    

      

      2.如何创建一个JsonObject

     /**
         * 如何创建一个json对象
         */
        private void createJsonObject() {
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", "1");//给jsonObject创建一个id属性值为1
            jsonObject.addProperty("bookName", "《深入Java虚拟机》");
            jsonObject.addProperty("bookPrice", 36.8);
            jsonObject.addProperty("bookColor", "红色");
            //打印Json字符串
            System.out.println(jsonObject.toString());
            //给JsonObject添加对象
            JsonObject jsonObject1 = new JsonObject();
            jsonObject1.addProperty("chapterId", "1");
            jsonObject1.addProperty("chapterName", "第一章");
            //给JsonObject添加实体对象
            jsonObject.add("chapter", jsonObject1);
            System.out.println(jsonObject.toString());
    
    
        }
    

      

      3.数组的序列化与反序列化

    /**
         * 根据一个json创建一个数组
         */
        private void createJsonArray() {
            //把数组转换为Json字符串
            String[] args = new String[]{"《深入Java虚拟机》", "《Android插件编程》", "《OpenCV全解》"};
            Gson gson = new Gson();
            String jsonStr = gson.toJson(args);//先创建一个Json字符串
            System.out.println(jsonStr);//输出
            //把Json字符串转换为Json数组
            String[] strArray = gson.fromJson(jsonStr, String[].class);
            for (String s : strArray) {
                System.out.println(s);
            }
        }
    

      

      4.List的序列化与反序列化

     /**
         * 根据一个json创建一个list
         */
        private void createJsonToList() {
            //将list集合转换为json字符串
            List<Book> books = new ArrayList<>();
            books.add(new Book("1", "《深入Java虚拟机》"));
            books.add(new Book("2", "《OpenCV进阶》"));
            books.add(new Book("3", "《深入Android源代码》"));
            Gson gson = new Gson();
            String jsonListStr = gson.toJson(books);
            System.out.println(jsonListStr);
            //将json字符串转换为list集合
            //获取泛型的类型
            Type type = new TypeToken<List<Book>>() {
            }.getType();
            //使用gson将字符串转换为泛型集合,即List<Book>
            List<Book> books1 = gson.fromJson(jsonListStr, type);
            for (Book book : books1) {
                System.out.println(book.getName());
            }
        }
    

      

      5.序列化与反序列化综合例子(基于Book对象)

     /**
         * json的序列化与反序列化
         * 使用toJson实现序列化,使用fromJson实现反序列化
         */
        private void jsonSeriaReSeria() {
            Gson gson = new Gson();
            Book book = new Book("1", "《深入Java虚拟机》");
            //将book类序列化成字符串
            String bookStr = gson.toJson(book);
            System.out.println(bookStr);
            //将bookStr反序列化成为Book类
            Book b = gson.fromJson(bookStr, Book.class);
            System.out.println(b.getName());
        }
    

      

      6.如何为属性做兼容性处理(重命名、预设名称等)

     /**
         * 如何给json属性重命名
         * 假设我们有这样一个需求:由于接口改版,从服务端返回的api中的book字段的name属性,变为了bookName。如果我们
         * 仍然用name进行解析,则接不到bookName的值,而由于服务端没有返回name,则解析后name=null。如果要考虑到兼容性那么我们的的Book类的属性就
         * 需要做一下兼容性的处理。
         * 使用@SerializedName可以给属性重命名。用@SerializedName的alternate属性给Book的属性做扩展
         */
        private void reNameProperty() {
            String bookJson = "{"id":"1","bookName":"《深入Java虚拟机》"}";
            Gson gson = new Gson();
            Book book = gson.fromJson(bookJson, Book.class);
            System.out.println(book.getName());
        }
    

      

      7.GsonBuilder的一些基础配置

    /**
         * 对GsonBuilder一些属性介绍
         */
        private void gsonBuilderProperty() {
            Gson gson = new GsonBuilder()
                    .serializeNulls()//默认情况下如果某一个属性为null,那么此属性不会参与序列化和反序列化的过程,加上此属性后会参与序列化和反序列化的过程
                    .setPrettyPrinting()//格式化json字符串的输出,默认情况下是输出一行,经过这个属性设置后会格式化输出,即有缩进的输出
                    .setDateFormat("yyyy-MM-dd HH:mm:ss")//对时间进行格式化
                    .create();
        }
    

      

      8.TypeAdapter使用方法介绍

     /**
         * typeAdapter的使用方法
         * TypeAdapter是一个泛型抽象类,用于接管某种类型的序列化和反序列化的过程
         * 它包含两个抽象方法write和read,分别用于自定义的序列化和反序列化的过程
         */
        private void useTypeAdapter() {
            Gson gson = new GsonBuilder().registerTypeAdapter(Book.class,new BookTypeAdapter()).create();
            Book book = new Book("1","深入Java虚拟机");
            System.out.println(gson.toJson(book));
    
            String bookJson = "{"Id":"1","Name":"《深入Java虚拟机》"}";
            Book book1 = gson.fromJson(bookJson,Book.class);
            System.out.println(gson.toJson(book1));
        }
    

      以下是BookTypeAdapter的代码介绍

    package com.yw.gsonlib;
    
    import com.google.gson.TypeAdapter;
    import com.google.gson.stream.JsonReader;
    import com.google.gson.stream.JsonWriter;
    
    import java.io.IOException;
    
    /**
     * create by yangwei
     * on 2020-02-23 15:12
     */
    public class BookTypeAdapter extends TypeAdapter<Book> {
        /**
         * 序列化接口
         *
         * @param jsonWriter
         * @param book
         * @throws IOException
         */
        @Override
        public void write(JsonWriter jsonWriter, Book book) throws IOException {
            //流式序列化对象开始
            jsonWriter.beginObject();
            //将Json的key值都指定为首字母大写
            jsonWriter.name("Id").value(book.getId());
            jsonWriter.name("Name").value(book.getName());
            //流式序列化对象结束
            jsonWriter.endObject();
        }
    
        /**
         * 反序列化接口
         *
         * @param jsonReader
         * @return
         * @throws IOException
         */
        @Override
        public Book read(JsonReader jsonReader) throws IOException {
            Book book = new Book();
            //流式反序列化开始
            jsonReader.beginObject();
            while (jsonReader.hasNext()) {
                switch (jsonReader.nextName()) {
                    case "id":
                    case "Id":
                        book.setId(jsonReader.nextString());
                        break;
                    case "name":
                    case "Name":
                        book.setName(jsonReader.nextString());
                        break;
                }
            }
            //流式反序列化结束
            jsonReader.endObject();
            return book;
        }
    }
    

      

    三、总结

     讲到这里gson的内容基本上就讲完了,相信小伙伴们对gson已经有了一个全面的了解。主要要清楚:如何序列化与反序列化,如何自定义序列化过程、如何更改属性,如何创建对象、如何对泛型进行序列化与反序列化。

    ps:由于后面会讲到Retrofit2的数据转换工厂的实现方式(GsonConverterFactory.create()),对于基础比较薄弱的开发者来说补充一下Gson相关知识,再接着看Retrofit2的转换工厂的实现原理会非常的清晰。

      另外下一节将介绍自定义泛型,gons和自定义泛型了解清楚后再去看源代码的实现流程,你会发现根本不需要动脑子,一看就明白了。

      

  • 相关阅读:
    理解HTTP协议
    节点操作,节点属性的操作及DOM event事件
    jQuery的属性,事件及操作
    jQuery中的选择器及筛选器
    javascipt中的DOM对象
    javascript中的BOM对象
    javascript中的Date对象和Math对象
    javascript中的字符串对象
    javascript基础
    CSS核心内容之浮动
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/12350156.html
Copyright © 2020-2023  润新知