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这只是一个例子。我想为类使用一个转换器,并且能够像预期的那样展开转换后的值。实际上,我将默认的Log4j2LogEvent
转换为更适合我的项目的对象。您可以在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);
}
}