【问题标题】:Apply @JsonProperty on either Setter OR Getter, not both在 Setter 或 Getter 上应用 @JsonProperty,而不是两者
【发布时间】:2020-10-07 11:35:26
【问题描述】:

我有这门课:

public class Foo {
    private int bar;
    public int getBar() {
        return this.bar;
    }
    @JsonProperty("baaaaar")
    public setBar(int bar) {
        this.bar = bar;
    }
}

现在如果我序列化它,我会得到以下结果:{"baaaaar": 0} 这对我来说似乎很奇怪,因为我只将 @JsonProperty 应用于 Setter。我认为 Getter 会保持其默认行为,即使用属性名称,而“baaaaar”只会用于反序列化。 是否有解决方案,或者我是否也必须将 @JsonProperty("bar") 显式添加到 Getter 中?

【问题讨论】:

    标签: java json serialization jackson


    【解决方案1】:

    默认情况下,getter OR setter 上的单个@JsonProperty 确实为两者设置了属性。这确实允许您为整个应用程序重命名属性
    正如this answer 中提到的,如果您希望它们具有不同的值,则需要同时设置@JsonProperty,例如

    public class Foo {
        private int bar;
    
        @JsonProperty("bar") // Serialization
        public int getBar() {
            return this.bar;
        }
    
        @JsonProperty("baaaaar") // Deserialization
        public setBar(int bar) {
            this.bar = bar;
        }
    }
    

    编辑 1:

    您可以在documentationaccess properties 之后使用@JsonProperty(access = WRITE_ONLY)

    【讨论】:

    • 感谢您的回答,这确实是我经过一番研究后发现的,但我认为可能还有另一种方式,例如但不完全是 JsonProperty“访问”参数。
    • 可能有,我刚查了文档。检查我的编辑。
    • @AlaAbid 您可以使用WRITE_ONLY 进行反序列化或使用READ_ONLY 进行序列化。
    • 不幸的是它不工作。当字段本身在响应中不再可见时。
    • @saran3h 您需要在序列化程序中明确允许空值。检查这个answer
    猜你喜欢
    • 2023-03-15
    • 2021-08-01
    • 1970-01-01
    • 2014-10-08
    • 2014-03-16
    • 2018-03-17
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多