Gson使用方法详解

1,226 阅读3分钟

1.如何创建一个Gson对象

//第一种方式`
Gson gson = new Gson();

//第二种方式
Gson gson1 = new GsonBuilder().create();

2.如何创建一个JsonObject

void createJSONObject(){
    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject.put("name","value");
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

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

// 根据一个json创建一个数组
private void createJsonArray() {
    //把数组转换为Json字符串
    String[]  args = new String[]{ "《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的代码介绍

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;

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