使用Jackson进行JSON处理:方法 #1/3:读和写事件流

1. 从事件流读

我们可以将{"name": "Jason", "hobby": "skateboard"}当作事件流,为了遍历流,我们通过调用JsonParser.nextToken()来推进游标,直到到达了流的结束点。

上面所说的可能并不是特别好理解,看了下面的例子,应该就很好理解了。

我们现在希望将{"name": "Jason", "hobby": "skateboard"}解析为

@Data
private static class User {

    private String name;

    private String hobby;
}

的一个实例。

可以使用以下代码实现。

JsonFactory jsonFactory = new JsonFactory();
String jsonString = "{\"name\": \"Jason\", \"hobby\": \"skateboard\"}";
JsonParser jsonParser = jsonFactory.createParser(jsonString);
User user = readFromEventStream(jsonParser);

User readFromEventStream(JsonParser jsonParser) throws IOException {
    if (!Objects.equals(jsonParser.nextToken(), JsonToken.START_OBJECT)) {
        throw new IOException("第一个token并不是JsonToken.START_OBJECT");
    }

    User user = new User();
    while (!Objects.equals(jsonParser.nextToken(), JsonToken.END_OBJECT)) { // 循环,直到碰到JsonToken.END_OBJECT
        String attributeName = jsonParser.getCurrentName(); // 获取属性名称
        jsonParser.nextToken(); // 获取下一个token,可以通过这个token获取属性的值
        if (Objects.equals(attributeName, "name")) {
            user.setName(jsonParser.getText());
        } else if (Objects.equals(attributeName, "hobby")) {
            user.setHobby(jsonParser.getText());
        } else {
            // 不认识的属性名称,看情况处理,这里直接忽略
        }
    }
    jsonParser.close(); // https://github.com/FasterXML/jackson-core/blob/master/src/main/java/com/fasterxml/jackson/core/JsonParser.java#L268
    return user;
}

写进事件流

现在我们来看一下怎么将User实例转变为JSON字符串。

JsonFactory jsonFactory = new JsonFactory();
JsonGenerator jsonGenerator = jsonFactory.createGenerator(System.out, JsonEncoding.UTF8);
jsonGenerator.useDefaultPrettyPrinter();
User user = new User();
user.setName("Jason");
user.setHobby("skateboard");
writeToEventStream(jsonGenerator, user);

void writeToEventStream(JsonGenerator jsonGenerator, User user) throws IOException {
    jsonGenerator.writeStartObject();
    jsonGenerator.writeStringField("name", user.getName());
    jsonGenerator.writeStringField("hobby", user.getHobby());
    jsonGenerator.writeEndObject();
    jsonGenerator.close();
}

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容