前面介绍了一片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); }