Вот рабочий пример (я использую последнюю 2.9.5
версию Джексона).
public class RootClass {
@JsonUnwrapped
public NestedClass nested = new NestedClass();
public static void main(String[] args) throws JsonProcessingException {
RootClass obj = new RootClass();
System.out.println(new ObjectMapper().writeValueAsString(obj));
}
}
@JsonSerialize(converter = NestedClassConverter.class)
class NestedClass {
public String foo = "fooVal";
public String bar = "barVal";
}
class NestedClassWrapper {
private NestedClass wrapped;
public NestedClassWrapper(NestedClass wrapped) {
this.wrapped = wrapped;
}
public String getFoo() {
return wrapped.foo;
}
public String getBar() {
return wrapped.bar;
}
}
class NestedClassConverter extends StdConverter<NestedClass, NestedClassWrapper> {
@Override
public NestedClassWrapper convert(NestedClass value) {
return new NestedClassWrapper(value);
}
}
Если я удаляю @JsonSerialize
из NestedClass
, он работает как положено и выдает {"foo":"fooVal","bar":"barVal"}
.
Но если используется конвертер, вложенное поле не распаковывается, и я получаю: {"nested":{"bar":"barVal","foo":"fooVal"}}
.
Как получить ожидаемый распакованный результат, используя converter
?
Обновление:
В отладчике (UnwrappingBeanPropertyWriter.class
) я вижу, что в случае использования конвертера _findAndAddDynamic
возвращает StdDelegationSerializer
вместо UnwrappingBeanSerializer
. Это ошибка или ожидаемое поведение? Есть обходной путь?