Gson是Google的一个Java开源库,利用序列化和反序列化技术,实现json字符串和Java对象间的转换。
AndroidStudio的build.gradle文件中配置compile 'com.google.code.gson:gson:2.8.0',Rebuild后即可导入库文件。
实例一:基本类型
{"name":"mrxi","age":"24","gender":1,"school":"bupt"}
Student类:
package com.xi.liuliu.testgson;
/**
* Created by liuliu on 2017/6/16.
*/
public class Student {
private String name;
private String age;
private int gender;
private String school;
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 int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
@Override
public String toString() {
return "name:" + getName() + " age:" + getAge() + " gender:" + getGender() + " school:" + getSchool();
}
}
Student类的成员变量名要和json中的key一致,成员变量类型要和json中的value类型一致;并且要生成getter和setter方法。
使用如下:
public void testGson(String json) {
Gson gson = new Gson();
Student student = gson.fromJson(json,Student.class);
System.out.println(student);
}
也可以使用泛型:
public <T> T parseJsonWithGson(String jsonData, Class<T> type) {
Gson gson = new Gson();
T result = gson.fromJson(jsonData, type);
return result;
}
public void testGson(String json) {
Student student = parseJsonWithGson(json, Student.class);
}
实例二:json中嵌套json
{"name":"mrxi","age":"24","gender":1,"school":"bupt","grade":{"course":"English","score":100,"level":"A"}}
student类:
package com.xi.liuliu.testgson;
/**
* Created by liuliu on 2017/6/16.
*/
public class Student {
private String name;
private String age;
private int gender;
private String school;
private Grade grade;
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
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 int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
@Override
public String toString() {
return "name:" + getName() + " age:" + getAge() + " gender:" + getGender() + " school:" + getSchool();
}
}
Grade类:
package com.xi.liuliu.testgson;
/**
* Created by liuliu on 2017/6/16.
*/
public class Grade {
private String course;
private String score;
private String level;
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
}
嵌套的json要新建Grade类,Student新增grade成员变量,并添加getter和setter方法。使用和实例一相同。
实例三:json中包含jsonArray
{"name":"mrxi","age":"24","gender":1,"school":"bupt","grade":[{"course":"English","score":100,"level":"A"},{"course":"Math","score":90,"level":"A"}]}
Student类:
package com.xi.liuliu.testgson;
import java.util.List;
/**
* Created by liuliu on 2017/6/16.
*/
public class Student {
private String name;
private String age;
private int gender;
private String school;
private List<Course> grade;
public List<Course> getGrade() {
return grade;
}
public void setGrade(List<Course> grade) {
this.grade = grade;
}
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 int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
@Override
public String toString() {
String grades = null;
for (Course course : grade) {
grades = grades + course.toString();
}
return "name:" + getName() + " age:" + getAge() + " gender:" + getGender() + " school:" + getSchool() + "grade:" + grades;
}
}
Course类:
package com.xi.liuliu.testgson;
/**
* Created by liuliu on 2017/6/16.
*/
public class Course {
private String course;
private String score;
private String level;
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
@Override
public String toString() {
return "course:" + getCourse() + "score:" + getScore() + "level:" + getLevel();
}
}
使用和实例一中相同。
public <T> T parseJsonWithGson(String jsonData, Class<T> type) {
Gson gson = new Gson();
T result = gson.fromJson(jsonData, type);
return result;
}
public void testGson(String json) {
Student student = parseJsonWithGson(json, Student.class);
System.out.println(student);
}
grade字段是一个jsonArray,jsonArray用List表示,jsonArray中每一项都是Course。
其他常用用法:
1 字段名的对应
有时接口返回的字段命名和我们的编码风格不一致,如服务端返回{"user_name":"mrxi","login_password":"asdf123"},为了继续使用驼峰标识,我们可以这样:
package com.xi.liuliu.testgson;
import com.google.gson.annotations.SerializedName;
/**
* Created by liuliu on 2017/6/16.
*/
public class User {
@SerializedName("user_name")
private String userName;
@SerializedName("login_password")
private String loginPassword;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getLoginPassword() {
return loginPassword;
}
public void setLoginPassword(String loginPassword) {
this.loginPassword = loginPassword;
}
}
2 控制某些字段的是否可以被序列化
Gson提供了@Expose注解来控制成员变量的序列化和非序列化,这个注解有两个变量:serialize和deserialize,默认都是true。若要使这个注解生效,必须使用GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法来构建Gson对象。
package com.xi.liuliu.testgson;
import com.google.gson.annotations.Expose;
/**
* Created by liuliu on 2017/6/16.
*/
public class Student {
@Expose
private String name;
@Expose(serialize = false)
private String age;
@Expose(serialize = false, deserialize = false)
private String identityCardNumber;
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 getIdentityCardNumber() {
return identityCardNumber;
}
public void setIdentityCardNumber(String identityCardNumber) {
this.identityCardNumber = identityCardNumber;
}
}
使用:
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
反序列化生成Student时,只有name、age会被赋值;序列化生成Json字符串时,只会包含name字段。
3版本号控制
Gson还提供了@Since注解进行版本控制,使用GsonBuilder构建时指定版本号,高于该版本的字段在序列化和反序列化时都将被忽略。
package com.xi.liuliu.testgson;
import com.google.gson.annotations.Since;
/**
* Created by liuliu on 2017/6/16.
*/
public class Student {
@Since(3.1)
private String name;
@Since(3.1)
private String age;
@Since(3.0)
private String identityCardNumber;
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 getIdentityCardNumber() {
return identityCardNumber;
}
public void setIdentityCardNumber(String identityCardNumber) {
this.identityCardNumber = identityCardNumber;
}
}
使用:
Gson gson = new GsonBuilder().setVersion(3.0).create();
name和age字段由于版本号高于Gson对象指定的3.0版本,在转换过程中会被自动忽略,从而控制变量是否序列化。