Java 当属性';s类使用@JsonSerialize的转换器?

Java 当属性';s类使用@JsonSerialize的转换器?,java,jackson,jackson-databind,Java,Jackson,Jackson Databind,下面是一个工作示例(我使用最新的2.9.5Jackson版本) 公共类根类{ @JsonUnwrapped public NestedClass nested=新NestedClass(); 公共静态void main(字符串[]args)引发JsonProcessingException{ RootClass obj=新的RootClass(); System.out.println(新的ObjectMapper().writeValueAsString(obj)); } } @JsonSer

下面是一个工作示例(我使用最新的
2.9.5
Jackson版本)

公共类根类{
@JsonUnwrapped
public NestedClass nested=新NestedClass();
公共静态void main(字符串[]args)引发JsonProcessingException{
RootClass obj=新的RootClass();
System.out.println(新的ObjectMapper().writeValueAsString(obj));
}
}
@JsonSerialize(converter=NestedClassConverter.class)
类嵌套类{
公共字符串foo=“fooVal”;
公共字符串bar=“barVal”;
}
类嵌套类包装器{
私有嵌套类;
公共NestedClassWrapper(NestedClassWrapped){
this.wrapped=wrapped;
}
公共字符串getFoo(){
return.foo;
}
公共字符串getBar(){
返回0.bar;
}
}
类NestedClassConverter扩展StdConverter{
@凌驾
公共NestedClassWrapper转换(NestedClass值){
返回新的NestedClassWrapper(值);
}
}
如果我从
NestedClass
中删除
@JsonSerialize
,它将按预期工作并生成
{“foo”:“fooVal”,“bar”:“barVal”}
。 但是如果使用转换器,嵌套字段不会得到“unwrapped”,我得到:
{“nested”:{“bar”:“barVal”,“foo”:“fooVal”}

如何仍然使用
转换器
获得预期的展开结果

更新:
在调试器(
UnwrappingBeanPropertyWriter.class
)中,我可以看到,在使用转换器的情况下,
\u findAndAddDynamic
返回
StdDelegationSerializer
而不是
UnwrappingBeanSerializer
。这是一个bug还是预期的行为?有什么解决方法吗?

如果jackson已经按照您的预期序列化了类,为什么您想要一个自己的转换器?我不明白你在找什么。@Heri这只是一个例子。我想为类使用一个转换器,并且能够像预期的那样展开转换后的值。实际上,我将默认的Log4j2
LogEvent
转换为更适合我的项目的对象。您可以在GitHub上的
log4j2 logstash jsonevent layout
project上观察相同的方法。
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);
    }
}