【问题标题】:Jackson deserialization behaviour for a getter without property没有属性的 getter 的杰克逊反序列化行为
【发布时间】:2020-03-30 03:22:39
【问题描述】:

在使用 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"]}

这种行为很奇怪,我在文档中没有得到直接的解释,但是一旦创建了 getter,该属性就可用于序列化和反序列化。这使用生成的 json 响应中的函数名称创建了一个属性。

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

【问题讨论】:

    标签: java jackson


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 2015-04-07
      相关资源
      最近更新 更多