我的目标是在Android上反序列化BSON文档数组。当外部数组是匿名时,反序列化失败(尝试反序列化为CustomObject[].class
)。当数组被包含在包含数组的键的对象中时,它可以工作(反序列化为WrapperObject.class
)。
在JSON中,对象看起来像这样:
[{"id":....},{"id":....},{"id":....}....]
根据BSON Specification,BSON数组是一个常规的BSON文档,其中包含键的整数值。换句话说,BSON中的相同对象如下所示:
{"0":{"id":....},"1":{"id":....},"2":{"id":....}....}
我试图使用bson4jackson在上面抛出一个“无法反序列化 x 的START_OBJECT令牌”错误并且在堆栈跟踪中我注意到意外令牌是“ 0 ” - 数组开头的BSON表示。
我现在的解决方案是将数组包装在一个新的根对象中,该对象在JSON中看起来像这样:
{"data":[{"id":....},{"id":....},{"id":....},....]}
你可以设置bson4jackson或任何其他Java的反序列化库来将根对象视为一个数组并按原样处理它而不包装吗?
答案 0 :(得分:4)
原因是bson4jackson是一个低级库,它不知道当前正在解析的对象的类型。在BSON中,数组是对象,bson4jackson只假设每个文档都有一个对象作为其根。
但是,有一个解决方法。每当读取数组时,Jackson都会调用低级解析器的isExpectedStartArrayToken()
方法。因此,如果当前对象是文档但是需要数组,bson4jackson可以切换到数组解析。
修复工具刚刚实施。有关详细信息,请参阅:
https://github.com/michel-kraemer/bson4jackson/issues/31