Gson使用方法详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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;
= name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
}
1.如何创建⼀个Gson对象
/**
* 创建Gson对象的两种形式
*/
private void createGsonObject() {
//第⼀种⽅式
Gson gson = new Gson();
//第⼆种⽅式
Gson gson1 = new GsonBuilder().create();
//⽅式⼆除了可以创建⼀个Gson对象以外还可以进⾏多项配置,例如,设置⽇期的格式化
// 例如: new GsonBuilder().setDateFormat("yyyy-MM-dd");
}
/**
* 如何创建⼀个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);
//将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 {
//流式序列化对象开始
//将Json的key值都指定为⾸字母⼤写
("Id").value(book.getId());
("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和⾃定义泛型了解清楚后再去看源代码的实现流程,你会发现根本不需要动脑⼦,⼀看就明⽩了。

相关文档
最新文档