Яссон неправильно конвертирует подклассы

Я создаю приложение для 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 и использовать ее при десериализации. Это можно сделать с помощью специальной пары сериализатор / десериализатор.

Пример содержит настраиваемый сериализатор / десериализатор, который должен дать вам желаемый результат, но вам придется реализовать этот настраиваемый сериализатор / десериализатор самостоятельно.

Другие вопросы по тегам