【问题标题】:Jackson custom serializer serialize field twice if property name not equal field name如果属性名称不等于字段名称,杰克逊自定义序列化程序将字段序列化两次
【发布时间】:2017-06-15 18:48:33
【问题描述】:

如果您使用自定义序列化,如果属性名称不等于字段名称,您会得到意想不到的效果。 为什么字段会被序列化两次?

我的代码示例:

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"}

我做错了什么?

【问题讨论】:

    标签: java json serialization jackson


    【解决方案1】:

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

    这对我有用。

    【讨论】:

      【解决方案2】:

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

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

      除此之外,您还指定了一个@JsonProperty,Jackson 将在具有提供的名称mode 的字段中序列化。

      @JsonDeserialize 如果字段的名称与 getter 方法所隐含的名称匹配,则该字段上的注释会导致 Jackson 忽略 getter。名为isPublic 的布尔字段对应的getter 方法是isIsPublic()

      您指定mode 的Json 字段名称这一事实不会影响上述内容。

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 1970-01-01
        • 2017-09-02
        • 1970-01-01
        • 2020-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多