8. Gson流式反序列化JsonReader
约 392 字大约 1 分钟
前面介绍了一片Gson的流式序列化,接下来我们看一下流式的反序列化,主要借助JsonReader来实现
1. 关键类与方法
流式反序列化,关键实现类为 JsonReader,每次在使用前后需要通过 beginObject
/endObject
来声明一个序列化的过程
JsonReader reader = new JsonReader(new StringReader(json));
reader.beginObject(); // throws IOException
// ....
reader.endObject();
2. 实例演示
接下来通过一个实例来演示流式的反序列化过程
json串 "{\"user\": \"一灰灰blog\", \"age\": 18}"
反序列化过程
@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类中,新增一个列表对象
@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);
}
Loading...