Десериализовать массив объектов BSON как корневой объект в Java?
Моя цель - десериализовать массив документов BSON на Android. Когда внешний массив является анонимным, десериализация завершается неудачно (попытка десериализации CustomObject[].class
). Когда массив упакован в объект с ключом, содержащим массив, он работает (десериализация в WrapperObject.class
).
В JSON объект будет выглядеть так:
[{"id":....},{"id":....},{"id":....}....]
В соответствии со спецификацией BSON массив BSON представляет собой обычный документ BSON с целочисленными значениями для ключей. Другими словами, тот же объект в BSON выглядит так:
{"0":{"id":....},"1":{"id":....},"2":{"id":....}....}
Я пытался десериализовать вышеупомянутое с помощью bson4jackson, когда он выдавал ошибку "Невозможно десериализовать экземпляр x из токена START_OBJECT", и в трассировке стека я заметил, что неожиданный токен был "0" - представление BSON для начала массива,
Мое решение на данный момент состоит в том, чтобы обернуть массив в новый корневой объект, который в JSON будет выглядеть следующим образом:
{"data":[{"id":....},{"id":....},{"id":....},....]}
Можете ли вы установить bson4jackson или любую другую библиотеку десериализации для Java, чтобы обрабатывать корневой объект как массив и обрабатывать его как есть, без переноса?
1 ответ
Причина этого в том, что bson4jackson - это низкоуровневая библиотека, которая не знает о типе анализируемого в данный момент объекта. В BSON массивы являются объектами, а bson4jackson просто предполагает, что каждый документ имеет объект в качестве корня.
Однако для этого есть обходной путь. Джексон называет парсер низкого уровня isExpectedStartArrayToken()
метод всякий раз, когда массив читается. Таким образом, bson4jackson может переключиться на разбор массива, если текущий объект является документом, но ожидается массив.
Исправление только что было реализовано. Для получения дополнительной информации см.:
https://github.com/michel-kraemer/bson4jackson/issues/31