本次的主要内容:
- Gson 的流式反序列化
- Gson 的流式序列化
- 使用
GsonBuilder导出null值、格式化输出、日期时间及其它小功能
一、Gson 的流式反序列化
1.1 自动方式
Gson 提供了
fromJson()和toJson()两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。同时每个方法都提供了重载方法,我常用的总共有5个。
这是我在上一篇文章开头说的,但我到最后也一直没有是哪5个,这次我给列出来之后,你就知道这次讲的是哪个了。
Gson.toJson(Object);Gson.fromJson(Reader, Class);Gson.fromJson(String, Class);Gson.fromJson(Reader, Type);Gson.fromJson(String, Type);
1.2 手动方式
手动的方式就是使用 stream 包下的 JsonReader 类来手动实现反序列化,和 Android 中使用 pull 解析 XML 是比较类似的。
String json = "{\"name\":\"怪盗kidou\",\"age\":\"24\"}";User user = new User();JsonReader reader = new JsonReader(new StringReader(json));reader.beginObject(); // throws IOExceptionwhile (reader.hasNext()) {String s = reader.nextName();switch (s) {case "name":user.name = reader.nextString();break;case "age":user.age = reader.nextInt(); //自动转换break;case "email":user.email = reader.nextString();break;}}reader.endObject(); // throws IOExceptionSystem.out.println(user.name); // 怪盗kidouSystem.out.println(user.age); // 24System.out.println(user.email); // ikidou@example.com
其实自动方式最终都是通过 JsonReader 来实现的,如果第一个参数是 String 类型,那么 Gson 会创建一个 StringReader 转换成流操作。
Gson 流式解析
二、Gson 的流式序列化
2.1 自动方式

Gson.toJson 方法列表
所以啊,学会利用 IDE 的自动完成是多么重要这下知道了吧!可以看出用红框选中的部分就是我们要找的东西。
提示:
PrintStream(System.out)、StringBuilder、StringBuffer和*Writer都实现了Appendable接口。
Gson gson = new Gson();User user = new User("怪盗kidou",24,"ikidou@example.com");gson.toJson(user,System.out); // 写到控制台
2.2 手动方式
JsonWriter writer = new JsonWriter(new OutputStreamWriter(System.out));writer.beginObject() // throws IOException.name("name").value("怪盗kidou").name("age").value(24).name("email").nullValue() // 演示 null.endObject(); // throws IOExceptionwriter.flush(); // throws IOException// ==> {"name":"怪盗kidou","age":24,"email":null}
提示:除了
beginObject、endObject还有beginArray和endArray,两者可以相互嵌套,注意配对即可。beginArray后不可以调用name方法,同样beginObject后在调用value之前必须要调用name方法。
三、 使用 GsonBuilder 导出 null 值、格式化输出、日期时间
一般情况下 Gson 类提供的 API 已经能满足大部分的使用场景,但我们需要更多更特殊、更强大的功能时,这时候就引入一个新的类 GsonBuilder。
GsonBuilder 从名上也能知道是用于构建 Gson 实例的一个类,要想改变 Gson 默认的设置必须使用该类配置 Gson。
3.1 GsonBuilder 的用法
Gson gson = new GsonBuilder()// 各种配置.create(); // 生成配置好的 Gson
Gson 在默认情况下是不动导出值 null 的键的,如:
public class User {// 省略其它public String name;public int age;public String email;}
Gson gson = new Gson();User user = new User("怪盗kidou",24);System.out.println(gson.toJson(user));// ==> {"name":"怪盗kidou","age":24}
可以看出,email 字段是没有在 JSON 中出现的,当我们在调试是、需要导出完整的 JSON 串时或 API 接中要求没有值必须用 Null 时,就会比较有用。
使用方法:
Gson gson = new GsonBuilder().serializeNulls().create();User user = new User("怪盗kidou", 24);System.out.println(gson.toJson(user));// ==> {"name":"怪盗kidou","age":24,"email":null}
3.3 格式化输出、日期时间及其它
这些都比较简单就不一一分开写了。
Gson gson = new GsonBuilder()// 序列化 null.serializeNulls()// 设置日期时间格式,另有2个重载方法// 在序列化和反序化时均生效.setDateFormat("yyyy-MM-dd")// 禁此序列化内部类.disableInnerClassSerialization()// 生成不可执行的 JSON(多了 )]}' 这4个字符).generateNonExecutableJson()// 禁止转义 HTML 标签.disableHtmlEscaping()// 格式化输出.setPrettyPrinting().create();
注意:内部类(Inner Class)和嵌套类(Nested Class)的区别。

