对于没有属性的吸气剂,杰克逊进行反序列化行为

时间:2019-12-05 08:29:52

标签: java jackson

在使用杰克逊反序列化和序列化Java DTO时,遇到了奇怪的现象。 考虑这个示例Java dto,

public class TempClz {

    private List<String> field1;

    public List<String> getField1() {
        return field1;
    }

    public void setField1(List<String> field1) {
        this.field1 = field1;
    }

    public List<String> getNotAtAll() {
        return field1;
    }
}

现在,在将field1设置为某个值的情况下创建此类的对象,并通过标准杰克逊映射器对其进行序列化后,获得的示例json字符串为

{"field1":["123"],"notAtAll":["123"]}

这种行为很奇怪,我在docs中没有得到对此的直接解释,但是一旦完成一个吸气剂,该属性就可以用于序列化和反序列化了。这会在结果json响应中使用函数名称创建一个属性。

但是再次将此字符串反序列化为pojo时,notAtAll列表被追加到field1列表中,即在生成的Java对象中,field1的大小为2,值[“ 123”,“ 123”]似乎是错误的。在getter上使用jsonIgnore修复了此行为,但有人可以帮助您准确解释此行为以及是否有此意图吗?

1 个答案:

答案 0 :(得分:1)

Getter使非公共字段可序列化和反序列化。因此,毫无疑问,它在json中为notAtAll方法添加了getNotAtAll字段。当您反序列化同一字符串时,它具有来自两个getter的值,但它们都返回相同的字段,即field1。因此,这些值将添加到您的列表中。您正确地使用了@JsonIgnore来忽略此吸气剂。