Gson基本用法

来源:互联网 发布:淘宝卖家如何发货 编辑:程序博客网 时间:2024/06/04 19:47

 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版本,在转换过程中会被自动忽略,从而控制变量是否序列化。



原创粉丝点击