转载请注明出处http://blog.csdn.net/pngfi/article/details/54848449
在Gson的语境中序列化就是说把Java 对象转化为Json字符串,反序列化就是说把Json字符串转化为Java对象。
本篇博客基于Gson 2.8.0版
compile 'com.google.code.gson:gson:2.8.0'
比如有一个学生类如下:
public class Student {
public String name;
public int age;
public boolean isLOLPlayer;
}
序列化
Student stu=new Student("lin",18,true);
//通过默认的方式
Gson gson=new Gson();
String stuJson=gson.toJson(stu);
输出的Json字符串如下
{"name":"lin","age":18,"isLOLPlayer":true}
反序列化
//使用'是因为不想使用转义字符\"
String stuJosn="{'name':'lin','age':18,'isLOLPlayer':true}";
Gson gson=new Gson();
Student stu = gson.fromJson(stuJosn, Student.class);
关于null值的处理
比如说name为null
Student stu=new Student(null,18,true);
这时候默认情况下Gson会忽略掉这个字段,不产生相关的信息
输出结果
{"age":18,"isLOLPlayer":true}
那么反过来情况也是一样的,假设json字符创中没有name字段,产生的java对象name属性为null。这时候就要小心了,很可能会产生空指针异常
我们知道Json中有数组是以[ ]括起来的部分,Gson可以将它反序列化为Java中的数组、List、Set,我们可以根据自己的实际需求来选择。
如下学生有很多书:
public class Student {
public String name;
public int age;
public boolean isLOLPlayer;
public ArrayList books;
}
序列化:
ArrayList books=new ArrayList<>();
books.add(new Book("Thinking in Java","6666",78.0f));
books.add(new Book("编程之美","8888",63f));
Student stu=new Student("shilang",18,true,books);
Gson gson=new Gson();
String stuJosn=gson.toJson(stu);
输出的Json如下:
{
"age": 18,
"books": [
{
"bookName": "Thinking in Java",
"isbn": "6666",
"price": 78.0
},
{
"bookName": "编程之美",
"isbn": "8888",
"price": 63.0
}
],
"isLOLPlayer": true,
"name": "shilang"
}
你会发现其实代码和上面的简单Java对象没什么区别,确实如此,Gson内部帮我们处理了关于数组的情况,所以反序列化的情况就不说了,因为这不是我要说的是重点。我们想说的是单独一个数组或者List的情况,其实这时候序列化还是一样的,只是反序列化有所不同。
比如把下面的Json反序列化:
[
{
"bookName": "Thinking in Java",
"isbn": "6666",
"price": 78.0
},
{
"bookName": "编程之美",
"isbn": "8888",
"price": 63.0
}
]
如果你使用数组的话和之前的一样:
Book[] books = gson.fromJson(booksJson, Book[].class);
如果使用List的话,由于Java泛型擦除机制,运行时获取不到类型,Gson设计一个TypeToken类解决这个问题,如下
Type bookType=new TypeToken<ArrayList<Book>>(){}.getType();
ArrayList<Book> books = gson.fromJson(booksJson, bookType);
这里需要注意的是反序列化的Json数组中的所有对象的类型必须一致,以便每一个都可以映射为同一个Java类。
使用Set
Type bookType=new TypeToken<Set>(){}.getType();
Set set=gson.fromJson(booksJson,bookType);
仍然只说反序列化,比如下面一段Json
{
"content": "This is Content",
"title": "Hello",
"url": "http://pngfi.github.io"
}
你可封装成一个Java类,你也可以将其映射为Map,比如
Type mapType=new TypeToken<Map<String,String>>(){}.getType();
Map<String,String> map=gson.fromJson(mapJson,mapType);
不知道你有没有注意到我并没有具体指定哪种类型的Map,只是指定了类型为Map接口,这时候默认情况下Gson帮我们生成LinkedTreeMap 对象,这是Gson自己封装的类。List在不指定具体类型时生成ArrayList,Set默认为LinkedHashSet
比如说我定义了一个枚举Grade 表示学生成绩等级,其中A,B,C,D为四个等级
public enum Grade {
A,
B,
C,
D
}
学生类代码如下:
public class Student {
public Grade grade;
public String name;
public int age;
public boolean isLOLPlayer;
}
这时候我们来序列化看一下结果:
Student student=new Student(Grade.A,"shilang",15,false);
Gson gson=new Gson();
String stuJSON=gson.toJson(student);
结果如下:
{
"age": 15,
"grade": "A",
"isLOLPlayer": false,
"name": "shilang"
}
你会发现Gson帮我们将grade序列化为A
反序列化:
关于反序列化Gson肯定能将上面的那段Json反序列化为Java对象。
自定义枚举实例名:
这里要说明一中额外情况,就是有可能你不想让B序列化为字符串B,而是想序列化为1,你就可以通过添加下面的注解来实现。
public enum Grade {
A,
@SerializedName("1") B,
C,
D
}
关于@SerializedName注解请看下篇博文。