java - 将 JSON 对象数组反序列化为 Java 中的根对象?

标签 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 反序列化上述内容,但它抛出了“无法从 START_OBJECT token 中反序列化 x 的实例”错误,在堆栈跟踪中我注意到意外标记是“0”——数组开头的 BSON 表示。

目前,我的解决方案是将数组包装在一个新的根对象中,在 JSON 中,它看起来像这样:

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


您能否设置 bson4jackson 或任何其他 Java 反序列化库,将根对象视为一个数组并按原样处理它,而不进行换行?

最佳答案

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

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

修复刚刚实现。详情请见:
https://github.com/michel-kraemer/bson4jackson/issues/31

关于java - 将 JSON 对象数组反序列化为 Java 中的根对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17320921/

相关文章:

java - Suppressionfilter 在 checkstyle 配置文件中不起作用

java - 如何在同一面板上创建具有两个不同时间间隔的计时器/ Action 事件的多个动画组件?

java - 如何使用二维数组修复 Java 代码中的 "incompatible types"错误?

c# - 调试器可视化工具和 "Type is not marked as serializable"

java - Vaadin 是否有相当于 JavaFX GridPane 的功能?

android - 在 Android 上使用相机时,onActivityResult 无法与 RESULT_OK、RESULT_CANCEL 等一起使用

android - 为什么要使用 Gradle ?

java - 在 EditText 上使用 TextWatcher 在 android 中实时计算总数和总和?

c# - SOAP 泛型类型序列化

c# - Microsoft.WindowsAzure.Storage.Table.TableEntity 未使用 Storage 4.3.0.0 标记为可序列化