3

私の目標は、Android でドキュメントの BSON 配列を逆シリアル化することです。外側の配列が匿名の場合、逆シリアル化は失敗します (への逆シリアル化を試みますCustomObject[].class)。配列を含むキーを持つオブジェクトに配列がラップされている場合、それは機能します (へのデシリアライズWrapperObject.class)。

JSON では、オブジェクトは次のようになります。

[{"id":....},{"id":....},{"id":....}....]

BSON 仕様によると、BSON 配列はキーの整数値を持つ通常の BSON ドキュメントです。つまり、BSON の同じオブジェクトは次のようになります。

{"0":{"id":....},"1":{"id":....},"2":{"id":....}....}

「 START_OBJECTトークンからxのインスタンスをデシリアライズできません」というエラーがスローされたときにbson4jacksonを使用して上記をデシリアライズしようとしましたが、スタックトレースで予期しないトークンが「0」であることに気付きました-配列の先頭のBSON表現.

今のところ、私の解決策は、JSON では次のようになる新しいルート オブジェクトで配列をラップすることです。

{"data":[{"id":....},{"id":....},{"id":....},....]}


bson4jackson、または Java 用の他のデシリアライゼーション ライブラリを設定して、ルート オブジェクトを配列として扱い、ラップせずにそのまま処理できますか?

4

1 に答える 1

4

これは、bson4jackson が現在解析中のオブジェクトのタイプを認識しない低レベルのライブラリであるためです。BSON では配列はオブジェクトであり、bson4jackson はすべてのドキュメントがそのルートとしてオブジェクトを持っていると想定しています。

ただし、これには回避策があります。isExpectedStartArrayToken()Jackson は、配列が読み取られるたびに低レベルのパーサーのメソッドを呼び出します。そのため、現在のオブジェクトがドキュメントの場合、bson4jackson が配列解析に切り替える可能性がありますが、配列が必要です。

修正が実装されたばかりです。詳細については、
https ://github.com/michel-kraemer/bson4jackson/issues/31 を参照してください。

于 2013-07-06T10:11:06.690 に答える