Google的Gson库,可以很好地把JSON转化成Java对象(反序列化),也支持把Java对象转化成JSON(序列化)
Gson库与json-lib的区别(个人观点,请指教,主要是反序列化上的区别):
1. Gson 反序列化时,JSON数据上若不存在JAVA对象的属性或者有格外的属性,Gson可以根据JSON数据和JAVA对象的共同属性进行赋值,不会报错;但是使用json-lib进行反序列化时,若JAVA对象不存在JSON数据上的属性时,会报错,当然这个可以通过配置参数实现;
2. Gson反序列化时,是根据JAVA对象上的属性进行反序列化的,不经过setter方法,所以无法通过setter方法在Gson反序列化时,对JAVA对象上的属性自定义赋值;json-lib反序列化时,通过setter方法对JAVA对象属性进行赋值,所以可以通过setter方法进行自定义赋值;
3. 若json格式中包含JSONArray数据,gson可以把整个json数据看做整体,通过.fromJson()把json格式数据转换成java对象即可,然后再在得到的java对象中进行列表的调用;对于json-lib, 需要先从json数据中把JSONArray单独提取出来进行转化。
以上是自己对Gson和json-lib的一个区别总结,若有观点错误,请指正。重点内容
Gson的使用:
1. 导入gson的jar包或者加依赖
2. 声明一个Gson对象
Gson gson = new Gson();
- 序列化
eg.
创建一个对象:
class Person{
private String name;
private String age;
private String sex;
public Person(String name, String age, String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
}
使用 .toJson(Object obj)把以上对象转化成一个json数据
Gson gson = new Gson();
Person p = new Person("小明","16","男");
String str = gson.toJson(p);
System.out.println(str);
输出结果:
{"name":"小明","age":"16","sex":"男"}
请注意,我在Person对象中,把Person的属性都定义为private类型,而且没有加setter和getter方法,最后Gson也可以把生成的对象实力p转换成json数据。所以,Gson是通过对象属性来进行json的序列化,至于对象属性是public还是private,好像没什么关系,这里还有待研究。
以此类推,对list和map的转化,也使用.toJson即可,只是输出的字符串样式不一样。
- 反序列化
a. 简单对象
eg:
还是对于Person对象,这里要获取对象的属性的值,所以要加上getter方法:
class Person{
private String name;
private String age;
private String sex;
public Person(String name, String age, String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
对于json数据为:
{"name":"小明","age":"16","sex":"男"}
使用.fromJson()
Gson gson = new Gson();
String str = "{'name':'小明','age':'16','sex':'男'}";
Person p1 = gson.fromJson(str, Person.class);
System.out.println("姓名:"+p1.getName());
System.out.println("性别:"+p1.getSex());
System.out.println("年龄:"+p1.getAge());
输出:
姓名:小明
性别:男
年龄:16
b. 反序列化为list
还是基于Person类
对于json数据:
[{"name":"小明","age":"16","sex":"男"},{"name":"小兰","age":"17","sex":"女"},{"name":"小a","age":"18","sex":"未知"}]
定义一个泛型函数:
public static <T> List<T> jsonArrayToList(String json,Class<T[]> clazz){
//使用GSON
Gson gson = new Gson();
T[] arr1 = gson.fromJson(json, clazz);
return Arrays.asList(arr1);
}
按照上面的写不会报一下错误:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.test.Person
异常原因:作为方法传入参数,Java编译过程会将泛型对象类型擦除
转化:
String str = "[{'name':'小明','age':'16','sex':'男'},{'name':'小兰','age':'17','sex':'女'},{'name':'小a','age':'18','sex':'未知'}]";
List<Person> persons = jsonArrayToList(str,Person[].class);
System.out.println("persons size:"+persons.size());
for(Person p : persons){
System.out.println("姓名:"+p.getName()+",年龄:"+p.getAge()+",性别:"+p.getSex());
}
输出:
persons size:3
姓名:小明,年龄:16,性别:男
姓名:小兰,年龄:17,性别:女
姓名:小a,年龄:18,性别:未知
c. 对象中含有list
基于对象:
class Person{
private String name;
private String age;
private String sex;
private List<Friend> friends;
public Person(String name, String age, String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public List<Friend> getFriends() {
return friends;
}
public void setFriends(List<Friend> friends) {
this.friends = friends;
}
}
class Friend{
private String name;
private String height;
public Friend(String name, String height){
this.name = name;
this.height = height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
}
对于json数据:
{"name":"小明","age":"20","sex":"male","friends":[{"name":"hehe","height":"165"},{"name":"hahha","height":"175"}]}
这里把json数据直接转化成一个java对象即可:
Gson gson = new Gson();
String str = "{'name':'小明','age':'20','sex':'male','friends':[{'name':'hehe','height':'165'},{'name':'hahha','height':'175'}]}";
Person p = gson.fromJson(str, Person.class);
System.out.println("姓名:"+p.getName());
System.out.println("年龄:"+p.getAge());
System.out.println("性别:"+p.getSex());
System.out.println("好友:");
for(Friend f : p.getFriends()){
System.out.println("姓名:"+f.getName()+",身高:"+f.getHeight());
}
输出:
姓名:小明
年龄:20
性别:male
好友:
姓名:hehe,身高:165
姓名:hahha,身高:175
以上为gson序列化和反序列化基础的学习,若哪里不对,还望指正。