我的目标是在Android上反序列化一系列BSON文档.当外部数组为匿名时,反序列化将失败(尝试反序列化为CustomObject [].class).当数组用包含该数组的键包装在对象中时,它将起作用(反序列化为WrapperObject.class).
在JSON中,对象如下所示:
[{"id":....},{"id":....},{"id":....}....]
根据BSON Specification,BSON数组是一个常规BSON文档,其中包含密钥的整数值.换句话说,BSON中的相同对象看起来像这样:
{"0":{"id":....},"1":{"id":....},"2":{"id":....}....}
我尝试使用bson4jackson对以上内容进行反序列化,因为它引发了“无法从START_OBJECT令牌中反序列化x的实例”错误,并且在stacktrace中我注意到意外的令牌为“ 0”-数组开头的BSON表示形式.
目前,我的解决方案是将数组包装在一个新的根对象中,该对象在JSON中如下所示:
{"data":[{"id":....},{"id":....},{"id":....},....]}
您可以设置bson4jackson或Java的任何其他反序列化库来将根对象视为数组并按原样处理而不进行包装吗?
解决方法:
原因是bson4jackson是一个低级库,它不知道当前正在解析的对象的类型.在BSON数组中是对象,而bson4jackson只是假设每个文档都有一个对象作为其根.
但是,有一种解决方法.每当读取数组时,Jackson都会调用低级解析器的isExpectedStartArrayToken()方法.因此,如果当前对象是一个文档,但是期望使用数组,则bson4jackson可能会切换到数组解析.
该修复程序刚刚实施.有关更多详细信息,请参见:
https://github.com/michel-kraemer/bson4jackson/issues/31