前面介绍了一片Gson的流式序列化,接下来我们看一下流式的反序列化,主要借助JsonReader来实现
1. 关键类与方法
流式反序列化,关键实现类为 JsonReader,每次在使用前后需要通过 beginObject/endObject来声明一个序列化的过程
| 12
 3
 4
 
 | JsonReader reader = new JsonReader(new StringReader(json));reader.beginObject();
 
 reader.endObject();
 
 | 
2. 实例演示
接下来通过一个实例来演示流式的反序列化过程
json串 "{\"user\": \"一灰灰blog\", \"age\": 18}"
反序列化过程
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 
 | @Datapublic 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类中,新增一个列表对象
| 12
 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
 
 | @Datapublic 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或者有更好的建议,欢迎批评指正,不吝感激
