Gson 的使用

1 篇文章 0 订阅

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();
  1. 序列化
    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即可,只是输出的字符串样式不一样。

  1. 反序列化
    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序列化和反序列化基础的学习,若哪里不对,还望指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值