9

我正在使用 Jackson (2.1.1) 进行 JSON 序列化/反序列化。我有一个带有 JAXB 注释的现有类。这些注释中的大多数都是正确的,可以按原样与杰克逊一起使用。我正在使用 mix-ins 来稍微改变这些类的反序列化/序列化。

在我的 ObjectMapper 构造函数中,我执行以下操作:

setAnnotationIntrospector(AnnotationIntrospector.pair(
                 new JacksonAnnotationIntrospector(), 
                 new JaxbAnnotationIntrospector(getTypeFactory())));

基于上述,Jackson 注释优先于 Jaxb,因为自省的顺序。这是基于 Jackson Jaxb文档。对于我想忽略@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 添加到成员而不是使用混合:

public class Foo {
    @JsonProperty @XmlTransient public String getBar() {...}
    @JsonIgnore public String getBaz() {...}
}

我似乎得到了与混入相同的行为。除非删除 @XmlTransient,否则该属性将被忽略。

4

1 回答 1

9

问题是该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

于 2013-01-04T22:06:19.070 回答