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

时间:2017-06-15 18:48:34

标签: java json serialization jackson

如果使用自定义序列化,如果属性名称不等于字段名称,则会产生意外影响。 为什么该字段被序列化两次?

我的代码示例:

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 class Test {
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        Mode mode = new Mode(true);
        String toJson = mapper.writeValueAsString(mode);
        System.out.println(toJson);
    }
}

结果我收到了:

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

我做错了什么?

2 个答案:

答案 0 :(得分:0)

Jackson遵循getter方法的java bean约定。

根据这些isPublic是一个名为public的布尔属性的getter,与isPublic中的Mode字段不同。杰克逊将其序列化为"public":true

除此之外,您还可以指定杰克逊将在字段中序列化的@JsonProperty,其中包含提供的名称mode

如果字段的名称与getter方法隐含的字段匹配,那么该字段上的

@JsonDeserialize注释会导致Jackson忽略getter。名为isPublic的布尔字段的相应getter方法将为isIsPublic()

您指定Json字段名称mode这一事实并不会影响上述情况。

答案 1 :(得分:0)

感谢您的详细解答 你是绝对正确的我需要隔离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;
    }
}

这适合我。

相关问题