Сериализовать объект без данных в Джексоне

Можно ли сериализовать объект без полей в Джексоне, используя только аннотации? Когда я пытаюсь сериализовать такой объект без аннотаций, я получаю:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class [redacted].SubjectObjectFeatureExtractor and no properties discovered to create BeanSerializer 

Я рассмотрел список аннотаций Джексона, не видя способа аннотировать класс как не имеющий сериализуемых данных. Я попытался положить @JsonCreator в пустой конструктор (не ожидая, что он сработает, так как это аннотация для десериализации), и я получил ту же ошибку. Для включения @JsonProperty нет аксессуаров или полей. Любые идеи?

Обновление: Причина этого заключается в том, что у меня есть список объектов, представляющих преобразования, которые могут быть применены к определенному типу данных. Некоторые из этих преобразований определяются параметрами, которые должны быть сериализованы, но некоторые из них не имеют параметров (без данных без данных). Я хотел бы иметь возможность сериализовать и десериализовать последовательность этих преобразований. Кроме того, я использую DefaultTyping.NON_FINAL, чтобы имя класса было сериализовано.

Обновление: Примерный класс:

class ExtractSomeFeature implements FeatureExtractor<SomeOtherType> {
    public void extractFeature(SomeOtherType obj, WeightedFeatureList output) {
          // do stuff
    }
 }

Мне не все равно, как выглядит JSON для этого, если я правильно десериализую List<FeatureExtractor>. У меня сложилось впечатление, что с использованием типизации по умолчанию ожидаемый JSON будет примерно таким:

['com.mycompany.foo.ExtractSomeFeature', {}]

Другие подклассы FeatureExtractor будут иметь реальные параметры, поэтому они предположительно выглядят примерно так:

[`com.mycompany.foo.SomeParameterizedFeature', {some actual JSON stuff in here}]

Я думаю, что я мог бы использовать @JsonValue для некоторого метода toJSONString() для возврата {}, но по возможности я хотел бы скрыть такой хакерство у конечных пользователей, которые будут создавать подклассы FeatureExtractor.

Ответ 1

Добавление следующей аннотации в класс, похоже, решает проблему:

@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)

Добавление несвязанного аннотированного типа

@JsonRootName("fred")

также, кажется, исправить это. Это, похоже, соответствует заявлению в билете JIRA, что добавление аннотации Джексона к классу предотвратит исключение. Однако, похоже, добавление аннотаций внутри класса не выполняется.

Ответ 2

Вы должны настроить свой объект сопоставления для поддержки этого случая.

ObjectMapper objectMapper = ...
  objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

Документацию по этой функции можно найти здесь: Fail on empty bean

Функция, определяющая, что происходит, когда для типа не найдено средств доступа (и нет аннотаций, указывающих, что он предназначен для сериализации). Если включено (по умолчанию), выдается исключение, чтобы указать их как несериализуемые типы; если отключено, они сериализуются как пустые объекты, т.е. без каких-либо свойств.

Ответ 4

Ответ на отключение SerializationFeature.FAIL_ON_EMPTY_BEANS является глобальным, и поэтому вы, возможно, не захотите его применять.

Ответ на добавление любой аннотации сериализации показал правильный (как в: Javadoc of SerializationFeature.FAIL_ON_EMPTY_BEANS) способ исправить это, но только с помощью хакерской или несвязанной аннотации.

Просто добавив...

@JsonSerialize

... моему классу (даже не в скобках после него, чтобы не было аргументов!) Я смог произвести тот же эффект (что опять-таки указано в Javadoc из SerializationFeature.FAIL_ON_EMPTY_BEANS).