Gson流式反序列化JsonReader

简介: 前面介绍了一片Gson的流式序列化,接下来我们看一下流式的反序列化,主要借助JsonReader来实现

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



相关文章
|
7月前
|
JSON Java API
GSON 泛型对象反序列化解决方案
GSON 泛型对象反序列化解决方案
343 0
|
7月前
|
JSON Android开发 数据格式
android 使用GSON 序列化对象出现字段被优化问题解决方案
android 使用GSON 序列化对象出现字段被优化问题解决方案
132 0
|
Android开发
Android 中使用Gson进行list集合的序列化与反序列化
Android 中使用Gson进行list集合的序列化与反序列化
197 0
|
JSON Java API
Android 中使用Gson完成对象的序列化与反序列化
Android 中使用Gson完成对象的序列化与反序列化
261 0
|
JSON 缓存 Java
Android 序列化框架 Gson 原理分析,可以优化吗?
Gson 是 Google 推出的 Java Json 解析库,具有接入成本低、使用便捷、功能扩展性良好等优点,想必大家都很熟悉了。在这篇文章里,我们将讨论 Gson 的基本用法和以及主要流程的源码分析。
358 0
|
JSON 数据格式
Gson流式序列化JsonWriter
通常我们序列化使用时,是直接使用Gson将整个对象转换为Json串,如果有看过gson源码的小伙伴会发现其内部实际上是基于JsonWriter来实现流式序列化的 接下来我们来看一下JsonWriter的使用姿势
657 0
|
JSON Java 数据格式
Gson序列化输出Ignore策略 -- Map篇
前面介绍了几种gson在序列化时,忽略某些字段数输出的方式,然而当时的实例中,需要序列化的对象都是Java bean对象,如果我们需要序列化的是Map对象,又可以怎么处理呢? 接下来我们通过实际的case,来演示如何实现Map忽略指定key的功能
599 0
|
JSON Java 数据格式
Gson之序列化指定忽略字段的三种写法
在我们日常使用json序列化框架过程中,经常会遇到在输出json字符串时,忽略某些字段,那么在Gson框架中,要想实现这种方式,可以怎么处理呢? 本文介绍几种常见的姿势
1362 0
|
JSON fastjson Java
【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )(二)
【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )(二)
360 0
|
JSON fastjson 测试技术
【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )(一)
【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )(一)
375 0