Gson基本用法

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



  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值