8. Gson流式反序列化JsonReader

一灰灰blog开源GsonGson约 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...