Java 如果属性名不等于字段名,则Jackson自定义序列化程序将字段序列化两次

Java 如果属性名不等于字段名,则Jackson自定义序列化程序将字段序列化两次,java,json,serialization,jackson,Java,Json,Serialization,Jackson,若使用自定义序列化,若属性名不等于字段名,则可能会产生意外效果。 为什么字段被序列化两次 我的代码示例: class Mode { @JsonProperty("mode") @JsonSerialize(using = ModeSerializer.class) private boolean isPublic; public Mode(boolean isPublic) { this.isPublic = isPublic; }

若使用自定义序列化,若属性名不等于字段名,则可能会产生意外效果。 为什么字段被序列化两次

我的代码示例:

class Mode {
    @JsonProperty("mode")
    @JsonSerialize(using = ModeSerializer.class)
    private boolean isPublic;

    public Mode(boolean isPublic) {
        this.isPublic = isPublic;
    }

    public boolean isPublic() {
        return isPublic;
    }
}
这里是我的自定义字段序列化程序:

class ModeSerializer extends JsonSerializer<Boolean> {

        @Override
        public void serialize(Boolean value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
            String out = "private";
            if (value) {
                out = "public";
            }
            gen.writeString(out);
        }
    }
因此,我收到:

{"public":true,"mode":"public"}

我做错了什么?

Jackson遵循JavaBeans约定获取方法

根据这些说明,
isPublic
是名为
public
的布尔属性的getter,与
模式中的
isPublic
字段不同。Jackson将把它序列化为
“public”:true

除此之外,您还可以指定一个
@JsonProperty
,Jackson将使用提供的名称
mode
在字段中序列化该属性

@jsondeselliate
如果字段的名称与getter方法暗示的名称匹配,则字段上的注释会导致Jackson忽略getter。名为
isPublic
的布尔字段的相应getter方法将是
isIsPublic()


您将Json字段名指定为
mode
并不影响上述内容。

感谢您的详细回答。
你完全正确,我需要隔离getter Public,这不仅可以重命名此方法,还可以使用@JsonIgnore注释来对该方法进行操作。 像这样:

class Mode {
    @JsonProperty("mode")
    @JsonSerialize(using = ModeSerializer.class)
    private boolean isPublic;

    public Mode(boolean isPublic) {
        this.isPublic = isPublic;
    }

    @JsonIgnore
    public boolean isPublic() {
        return isPublic;
    }
}
这对我有用

class Mode {
    @JsonProperty("mode")
    @JsonSerialize(using = ModeSerializer.class)
    private boolean isPublic;

    public Mode(boolean isPublic) {
        this.isPublic = isPublic;
    }

    @JsonIgnore
    public boolean isPublic() {
        return isPublic;
    }
}