211105-Gson流式反序列化JsonReader

文章目录
  1. 1. 关键类与方法
  2. 2. 实例演示
  • 一灰灰的联系方式
  • 前面介绍了一片Gson的流式序列化,接下来我们看一下流式的反序列化,主要借助JsonReader来实现

    1. 关键类与方法

    流式反序列化,关键实现类为 JsonReader,每次在使用前后需要通过 beginObject/endObject来声明一个序列化的过程

    1
    2
    3
    4
    JsonReader reader = new JsonReader(new StringReader(json));
    reader.beginObject(); // throws IOException
    // ....
    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或者有更好的建议,欢迎批评指正,不吝感激

    QrCode

    # Gson

    评论

    Your browser is out-of-date!

    Update your browser to view this website correctly. Update my browser now

    ×