前面介绍了一片Gson的流式序列化,接下来我们看一下流式的反序列化,主要借助JsonReader来实现
1. 关键类与方法
流式反序列化,关键实现类为 JsonReader,每次在使用前后需要通过 beginObject
/endObject
来声明一个序列化的过程
1 2 3 4
| JsonReader reader = new JsonReader(new StringReader(json)); reader.beginObject();
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
| @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
| @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或者有更好的建议,欢迎批评指正,不吝感激