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();
}