在不阻塞的情况下读取json流

Nit*_*mer 6 java nonblocking jackson

我希望能够使用 Jackson (2) 读取 json 消息流(从套接字)。

有多种方法可以将 Reader 作为源传递,例如:

ObjectMapper mapper = new ObjectMapper();
MyObject obj = mapper.readValue(aReader, MyObject.class);
Run Code Online (Sandbox Code Playgroud)

但这会阻塞,直到整个 json 消息到达,我想避免这种情况。

有没有办法拥有一个缓冲区,我可以继续向其中添加字节,并能够询问缓冲区是否包含特定类的完整 json 表示?
就像是:

JsonBuffer buffer = new JsonBuffer(MyObject.class);
...
buffer.add(readBytes);
if (buffer.hasObject()) {
    MyObject obj = buffer.readObject();
}
Run Code Online (Sandbox Code Playgroud)

谢谢。

Séb*_*uze 6

Jackson从 2.9 开始支持非阻塞 JSON 流解析。您可以在 Spring Framework 5 Jackson2Tokenizer 中找到有关如何使用它的示例


Sta*_*Man 4

您可以用来JsonParser获取单个事件/令牌(这是ObjectMapper内部使用的),这允许更精细的访问。但当前所有功能都使用阻塞 IO,因此无法进行所谓的非阻塞(又名“异步”)解析。

编辑:2019-09-18 -- 更正:Jackson 2.9 ( https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.9 ) 添加了对非阻塞/异步 JSON 解析的支持 (问题https:// github.com/FasterXML/jackson-core/issues/57