给定一个像这样的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)时,如果没有"活动视图"我发现com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields()
不使用_filteredProps
:< / p>
if (_filteredProps != null && provider.getActiveView() != null) {
props = _filteredProps;
} else {
props = _props;
}
当没有指定视图时,序列化不会尊重@JsonView
,这似乎很奇怪。我错过了什么吗?
有没有办法达到我想要的目的?
答案 0 :(得分:9)
我遇到了同样的问题。除非指定了视图,否则杰克逊似乎完全忽略了@JsonView注释。要获得您所处的行为,请为映射器提供Object.class的默认视图。
mapper.setConfig(mapper.getSerializationConfig().withView(Object.class));
请注意,您也可以使用
排除没有@JsonView注释的字段mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
这是杰克逊2.6.3