Яссон неправильно конвертирует подклассы
Я создаю приложение для Payara-Micro. Мне нужно преобразовать строку Json в объект, расширяющий суперкласс. Проблема, с которой я столкнулся, заключается в том, что поля родительского и дочернего элементов не заполнены, а созданный экземпляр не относится к подклассу типа:
Например Person
есть список Vehicle
(подтипы: Bike
, Bus
,...)
{
name: "John",
vehicles: [
{
type: "bike",
doors: 5
}
]
}
Результирующий объект этого json будет Person
объект с name
заполнен, и список Vehicle
с одним элементом, но тип этого элемента будет Vehicle
и нет полей в Vehicle
будет иметь ценность.
Jsonb jsonb = JsonbBuilder.create();
Person person = jsonb.fromJson(jsonString, Person.class);
1 ответ
К сожалению, функциональность, которую вы ищете, не является частью Yasson (или JSON-B). В спецификации это прямо не упоминается, но Руководство пользователя сериализаторов / десериализаторов намекает на это (выделено мной):
Посмотрим на образец. Представьте, что мы хотим сериализовать и десериализовать список носителей домашних животных. Переносимое домашнее животное, определенное абстрактным классом Animal. Это может быть любой из его подклассов. Мы хотели бы правильно сериализовать и десериализовать его. Для этого нам нужно сохранить информацию о типе в документе JSON и использовать ее при десериализации. Это можно сделать с помощью специальной пары сериализатор / десериализатор.
Пример содержит настраиваемый сериализатор / десериализатор, который должен дать вам желаемый результат, но вам придется реализовать этот настраиваемый сериализатор / десериализатор самостоятельно.