将BSON对象的反序列化数组作为Java中的根对象?

将BSON对象的反序列化数组作为Java中的根对象?,第1张

概述我的目标是在Android上反序列化一系列BSON文档.当外部数组为匿名时,反序列化将失败(尝试反序列化为CustomObject[].class).当数组用包含该数组的键包装在对象中时,它将起作用(反序列化为WrapperObject.class).在JSON中,对象如下所示:[{"id":....},{"id":....},{"id":....}....]

我的目标是在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

总结

以上是内存溢出为你收集整理的将BSON对象的反序列化数组作为Java中的根对象?全部内容,希望文章能够帮你解决将BSON对象的反序列化数组作为Java中的根对象?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1086709.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存