在Java中将JSON对象数组反序列化为根对象?

时间:2013-06-26 13:08:25

标签: java android serialization jackson bson

我的目标是在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的反序列化库来将根对象视为一个数组并按原样处理它而不包装吗?

1 个答案:

答案 0 :(得分:4)

原因是bson4jackson是一个低级库,它不知道当前正在解析的对象的类型。在BSON中,数组是对象,bson4jackson只假设每个文档都有一个对象作为其根。

但是,有一个解决方法。每当读取数组时,Jackson都会调用低级解析器的isExpectedStartArrayToken()方法。因此,如果当前对象是文档但是需要数组,bson4jackson可以切换到数组解析。

修复工具刚刚实施。有关详细信息,请参阅:
https://github.com/michel-kraemer/bson4jackson/issues/31