2013-06-26 61 views
3

我的目標是在Android上反序列化BSON數組文件。當外部數組是匿名時,反序列化失敗(嘗試反序列化爲CustomObject[].class)。當數組使用包含該數組的鍵的對象封裝時(反串行化爲WrapperObject.class)。在Java中將BSON對象反序列化爲根對象?

在JSON對象看起來像這樣:

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

按照BSON Specification所述BSON陣列是具有用於鍵整數值的定期BSON文檔。換句話說在BSON同一物體看起來是這樣的:

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

我試圖deserialise的使用bson4jackson以上時,它拋出一個「的X無法反序列化實例出來START_OBJECT令牌的」錯誤和在堆棧跟蹤中,我注意到意外的令牌是「」 - 數組開頭的BSON表示。

我的解決方案,現在,是包裝在一個新的根對象的陣列,在JSON,應該是這樣的:

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


你可以設置bson4jackson,或任何其他deserialisation庫Java,將根對象視爲數組並按原樣處理,而不進行包裝?

回答

4

原因是bson4jackson是一個底層庫,它不知道當前正在被解析的對象的類型。在BSON數組中,對象和bson4jackson只是假設每個文檔都有一個對象作爲它的根。

但是,有一個解決方法。每當讀取數組時,Jackson都會調用低級解析器的isExpectedStartArrayToken()方法。所以,如果當前對象是文檔,但是數組是預期的,那麼bson4jackson可以切換到數組解析。

該修復程序剛剛實施。詳情請參閱:
https://github.com/michel-kraemer/bson4jackson/issues/31