Gson流式反序列化JsonReader

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」。

前面介绍了一片Gson的流式序列化,接下来我们看一下流式的反序列化,主要借助JsonReader来实现

1. 关键类与方法

流式反序列化,关键实现类为 JsonReader,每次在使用前后需要通过 beginObject/endObject来声明一个序列化的过程

1
2
3
4
java复制代码JsonReader reader = new JsonReader(new StringReader(json));
reader.beginObject(); // throws IOException
// ....
reader.endObject();

2. 实例演示

接下来通过一个实例来演示流式的反序列化过程

json串 "{\"user\": \"一灰灰blog\", \"age\": 18}"

反序列化过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
java复制代码@Data
public static class User {
private String user;
private int age;
}

@Test
public void testReader() throws IOException {
String str = "{\"user\": \"一灰灰blog\", \"age\": 18}";

User user = new User();
JsonReader reader = new JsonReader(new StringReader(str));
reader.beginObject();
while(reader.hasNext()) {
String key = reader.nextName();
if ("user".equalsIgnoreCase(key)) {
user.setUser(reader.nextString());
} else if ("age".equalsIgnoreCase(key)) {
user.setAge(reader.nextInt());
}
}
reader.endObject();
System.out.println(user);
}

从上面的反序列化case,可以看出对于一层json串而言,比较简单,那么如果json串中的value是一个对象,或者数组,那改怎么处理呢?

如我们在User类中,新增一个列表对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
java复制代码@Data
public static class User {
private String user;
private int age;
private List<String> skills;
}

@Test
public void testReader() throws IOException {
String str = "{\"user\": \"一灰灰blog\", \"age\": 18, \"skills\": [\"java\", \"python\"]}";

User user = new User();
JsonReader reader = new JsonReader(new StringReader(str));
reader.beginObject();
while(reader.hasNext()) {
String key = reader.nextName();
if ("user".equalsIgnoreCase(key)) {
user.setUser(reader.nextString());
} else if ("age".equalsIgnoreCase(key)) {
user.setAge(reader.nextInt());
} else if ("skills".equalsIgnoreCase(key)) {
// 注意这个实现,支持了嵌套的操作
reader.beginArray();
List<String> skills = new ArrayList<>();
while (reader.hasNext()) {
skills.add(reader.nextString());
}
user.setSkills(skills);
reader.endArray();
}
}
reader.endObject();
System.out.println(user);
}

一灰灰的联系方式

尽信书则不如无书,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%