如何正确使用Jackson @JSONView从默认序列化中排除特定属性?

时间:2015-07-06 15:53:30

标签: jackson

给定一个像这样的JSON映射类:

public class Person {
    @JsonProperty
    String getName() { ... }

    @JsonProperty @JsonView(SpecialView.class)
    String getId() { ... }
}

在使用" normal"时,我只需要包含name属性序列化(即,没有指定视图),并在使用SpecialView进行序列化时包含这两个属性。但是当我做的时候

objectMapper.writeValueAsString(object)

(即,未指定任何视图),包含id属性。

如果我这样做

objectMapper..writerWithView(Object.class).writeValueAsString(object)

然后它的行为与预期一致。问题是,我没有控制所有进行序列化的代码,所以我不能强制它来指定一个视图。

当我逐步浏览杰克逊源代码(v 2.5.4)时,如果没有&#34;活动视图&#34;我发现com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields()不使用_filteredProps:< / p>

    if (_filteredProps != null && provider.getActiveView() != null) {
        props = _filteredProps;
    } else {
        props = _props;
    }

当没有指定视图时,序列化不会尊重@JsonView,这似乎很奇怪。我错过了什么吗?

有没有办法达到我想要的目的?

1 个答案:

答案 0 :(得分:9)

我遇到了同样的问题。除非指定了视图,否则杰克逊似乎完全忽略了@JsonView注释。要获得您所处的行为,请为映射器提供Object.class的默认视图。

mapper.setConfig(mapper.getSerializationConfig().withView(Object.class));

请注意,您也可以使用

排除没有@JsonView注释的字段
mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);

这是杰克逊2.6.3