3

我的目标是反序列化 Android 上的 BSON 文档数组。当外部数组是匿名的时,反序列化失败(试图反序列化为CustomObject[].class)。当数组被包装在一个对象中时,它的键包含该数组,它可以工作(反序列化为WrapperObject.class)。

在 JSON 中,对象看起来像这样:

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

根据BSON 规范,BSON 数组是一个常规的 BSON 文档,其中键值为整数。换句话说,BSON 中的同一个对象如下所示:

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

我试图使用 bson4jackson 反序列化上述内容,当它抛出“无法从 START_OBJECT 令牌中反序列化x的实例”错误并且在堆栈跟踪中我注意到意外的令牌是“ 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 回答