我使用Jackson(2.1.1)进行JSON序列化/反序列化。我有一个带有JAXB注释的现有类。大多数这些注释都是正确的,可以和杰克逊一样使用。我正在使用mix-ins来稍微改变这些类的反序列化/序列化。
在我的ObjectMapper构造函数中,我执行以下操作:
setAnnotationIntrospector(AnnotationIntrospector.pair(
new JacksonAnnotationIntrospector(),
new JaxbAnnotationIntrospector(getTypeFactory())));
基于以上所述,杰克逊注释优先于Jaxb,因为内省人的顺序。这是基于杰克逊Jaxb docs。对于我想要忽略的字段,将@JsonIgnore
添加到混合中的字段工作正常。在现有类中有几个字段标记为@XmlTransient
,我不想忽略它们。我尝试在混合中添加@JsonProperty
字段,但似乎无法正常工作。
这是原始课程:
public class Foo {
@XmlTransient public String getBar() {...}
public String getBaz() {...}
}
这是混合:
public interface FooMixIn {
@JsonIgnore String getBaz(); //ignore the baz property
@JsonProperty String getBar(); //override @XmlTransient with @JsonProperty
}
知道如何在不修改原始类的情况下解决这个问题吗?
我还测试过将@JsonProperty添加到成员而不是使用mix-ins:
public class Foo {
@JsonProperty @XmlTransient public String getBar() {...}
@JsonIgnore public String getBaz() {...}
}
我似乎得到了与混音相同的行为。除非删除@XmlTransient,否则将忽略该属性。
答案 0 :(得分:8)
问题是,如果任何一个内部检测器检测到忽略标记,AnnotationIntrospectorPair.hasIgnoreMarker()
方法基本上会忽略@JsonProperty
:
public boolean hasIgnoreMarker(AnnotatedMember m) {
return _primary.hasIgnoreMarker(m) || _secondary.hasIgnoreMarker(m);
}
参考:github
解决方法是将JaxbAnnotationIntrospector
子类化以获得所需的行为:
public class CustomJaxbAnnotationIntrospector extends JaxbAnnotationIntrospector {
public CustomJaxbAnnotationIntrospector(TypeFactory typeFactory) {
super(typeFactory);
}
@Override
public boolean hasIgnoreMarker(AnnotatedMember m) {
if ( m.hasAnnotation(JsonProperty.class) ) {
return false;
} else {
return super.hasIgnoreMarker(m);
}
}
}
然后只需使用CustomJaxbAnnotationIntrospector
中的AnnotationIntrospectorPair
。