6

Jackson(2)を使用してjsonメッセージのストリーム(ソケットから)を読み取れるようにしたい。

次のように、リーダーをソースとして渡す方法があります。

ObjectMapper mapper = new ObjectMapper();
MyObject obj = mapper.readValue(aReader, MyObject.class);

しかし、それはjsonメッセージ全体が到着するまでブロックされ、私はそれを避けたいと思います。

バッファーに特定のクラスの完全なjson表現が含まれているかどうかを確認する機能を備えたバイトを追加し続けることができるバッファーを作成する方法はありますか?
何かのようなもの:

JsonBuffer buffer = new JsonBuffer(MyObject.class);
...
buffer.add(readBytes);
if (buffer.hasObject()) {
    MyObject obj = buffer.readObject();
}

ありがとう。

4

6 に答える 6

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 )

于 2012-06-03T04:06:34.030 に答える
3

これは私の質問に対する答えではありませんが、私が思いついた回避策です。

Jackson 側でノンブロッキング IO を扱う代わりに、プロトコルに実装しました。
送信されるすべての json メッセージは、残りのメッセージの長さを保持する 4 バイトの int で埋められます。
json メッセージの読み取りが簡単になりました。長さを調べ、非同期で読み取り、結果の文字列で Jackson を使用できます。

ジャクソンから直接これを行う方法を誰かが知っていれば、私はまだ知りたい.

于 2012-06-03T06:48:29.127 に答える