Gson之常见的序列化与反序列化

转载请注明出处http://blog.csdn.net/pngfi/article/details/54848449

序列化与反序列化

在Gson的语境中序列化就是说把Java 对象转化为Json字符串,反序列化就是说把Json字符串转化为Java对象。

添加依赖

本篇博客基于Gson 2.8.0版

compile 'com.google.code.gson:gson:2.8.0'

简单Java对象

比如有一个学生类如下:

public class Student {
    public String name;
    public int age;
    public boolean isLOLPlayer;
}

序列化

Student stu=new Student("lin",18,true);
//通过默认的方式
Gson gson=new Gson();
String stuJson=gson.toJson(stu);

输出的Json字符串如下

{"name":"lin","age":18,"isLOLPlayer":true}

反序列化

  //使用'是因为不想使用转义字符\"
  String stuJosn="{'name':'lin','age':18,'isLOLPlayer':true}";
  Gson gson=new Gson();
  Student stu = gson.fromJson(stuJosn, Student.class);

通过打断点查看生成的对象如下:
这里写图片描述

关于null值的处理
比如说name为null

 Student stu=new Student(null,18,true);

这时候默认情况下Gson会忽略掉这个字段,不产生相关的信息
输出结果

{"age":18,"isLOLPlayer":true}

那么反过来情况也是一样的,假设json字符创中没有name字段,产生的java对象name属性为null。这时候就要小心了,很可能会产生空指针异常

数组/List/Set

我们知道Json中有数组是以[ ]括起来的部分,Gson可以将它反序列化为Java中的数组、List、Set,我们可以根据自己的实际需求来选择。
如下学生有很多书:

public class Student {
    public String name;
    public int age;
    public boolean isLOLPlayer;
    public ArrayList books;
}

序列化:

 ArrayList books=new ArrayList<>();
 books.add(new Book("Thinking in Java","6666",78.0f));
 books.add(new Book("编程之美","8888",63f));
 Student stu=new Student("shilang",18,true,books);
 Gson gson=new Gson();
 String stuJosn=gson.toJson(stu);

输出的Json如下:

{
    "age": 18,
    "books": [
        {
            "bookName": "Thinking in Java",
            "isbn": "6666",
            "price": 78.0
        },
        {
            "bookName": "编程之美",
            "isbn": "8888",
            "price": 63.0
        }
    ],
    "isLOLPlayer": true,
    "name": "shilang"
}

你会发现其实代码和上面的简单Java对象没什么区别,确实如此,Gson内部帮我们处理了关于数组的情况,所以反序列化的情况就不说了,因为这不是我要说的是重点。我们想说的是单独一个数组或者List的情况,其实这时候序列化还是一样的,只是反序列化有所不同。
比如把下面的Json反序列化:

[
    {
        "bookName": "Thinking in Java",
        "isbn": "6666",
        "price": 78.0
    },
    {
        "bookName": "编程之美",
        "isbn": "8888",
        "price": 63.0
    }
]

如果你使用数组的话和之前的一样:

 Book[] books = gson.fromJson(booksJson, Book[].class);

如果使用List的话,由于Java泛型擦除机制,运行时获取不到类型,Gson设计一个TypeToken类解决这个问题,如下

 Type bookType=new TypeToken<ArrayList<Book>>(){}.getType();
 ArrayList<Book> books = gson.fromJson(booksJson, bookType);

这里需要注意的是反序列化的Json数组中的所有对象的类型必须一致,以便每一个都可以映射为同一个Java类。

使用Set

Type bookType=new TypeToken<Set>(){}.getType();
Set set=gson.fromJson(booksJson,bookType);

Map

仍然只说反序列化,比如下面一段Json

{
    "content": "This is Content",
    "title": "Hello",
    "url": "http://pngfi.github.io"
}

你可封装成一个Java类,你也可以将其映射为Map,比如

Type mapType=new TypeToken<Map<String,String>>(){}.getType();
Map<String,String> map=gson.fromJson(mapJson,mapType);

不知道你有没有注意到我并没有具体指定哪种类型的Map,只是指定了类型为Map接口,这时候默认情况下Gson帮我们生成LinkedTreeMap 对象,这是Gson自己封装的类。List在不指定具体类型时生成ArrayList,Set默认为LinkedHashSet
Gson之常见的序列化与反序列化_第1张图片

Enum

比如说我定义了一个枚举Grade 表示学生成绩等级,其中A,B,C,D为四个等级

public enum Grade {
    A,
    B,
    C,
    D
}

学生类代码如下:

public class Student {
    public Grade grade;
    public String name;
    public int age;
    public boolean isLOLPlayer;
}

这时候我们来序列化看一下结果:

 Student student=new Student(Grade.A,"shilang",15,false);
 Gson gson=new Gson();
 String stuJSON=gson.toJson(student);

结果如下:

{
    "age": 15,
    "grade": "A",
    "isLOLPlayer": false,
    "name": "shilang"
}

你会发现Gson帮我们将grade序列化为A

反序列化:
关于反序列化Gson肯定能将上面的那段Json反序列化为Java对象。

自定义枚举实例名:
这里要说明一中额外情况,就是有可能你不想让B序列化为字符串B,而是想序列化为1,你就可以通过添加下面的注解来实现。

public enum Grade {
    A,
    @SerializedName("1") B,
    C,
    D
}

关于@SerializedName注解请看下篇博文。

你可能感兴趣的:(Gson)