【问题标题】:How to correctly use Jackson @JSONView to exclude specific properties from default serialization?如何正确使用 Jackson @JSONView 从默认序列化中排除特定属性?
【发布时间】:2015-12-10 10:18:55
【问题描述】:

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

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

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

当使用“正常”序列化(即未指定视图)时,我只需要包含name 属性,并在使用SpecialView 进行序列化时包含这两个属性。但是当我这样做时

objectMapper.writeValueAsString(object)

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

如果我这样做

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

然后它的行为符合预期。问题是,我无法控制所有进行序列化的代码,所以我不能强制所有代码都指定一个视图。

当我单步执行 Jackson 源代码 (v 2.5.4) 时,我发现如果没有“活动视图”,com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields() 不会使用 _filteredProps

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

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

有没有办法实现我想要的?

【问题讨论】:

    标签: jackson


    【解决方案1】:

    我遇到了同样的问题。除非指定了视图,否则杰克逊似乎完全忽略了 @JsonView 注释。为了得到你想要的行为,给你的映射器一个 Object.class 的默认视图。

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

    请注意,您也可以排除不使用 @JsonView 注释的字段

    mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
    

    这是 Jackson 2.6.3

    【讨论】:

    • 这将是一个很好的解决方案,但正如我在问题中所说,我不控制创建和配置ObjectMapper的代码
    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2017-07-10
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多