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