当前位置: 首页 > 知识库问答 >
问题:

无属性吸气器的jackson反序列化行为

谢学名
2023-03-14

在使用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设置为某个值的该类对象,并通过一个标准的jackson映射器对其进行序列化,获得的示例json字符串是

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

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

但是在将该字符串反序列化到pojo时,notAtAll列表被追加到field1列表中,即在结果的Java对象中,field1的大小为两个值[“123”,“123”],这似乎是错误的。使用getter上的jsonIgnore修复了这种行为,但是否有人可以帮助解释这种行为,以及这是否是故意的?

共有1个答案

阚吕恭
2023-03-14

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

 类似资料:
  • 问题内容: 使用Jackson 2,我正在寻找一种 通用的 方式将对象序列化为单个值(然后序列化它们,然后再填充该单个字段),而不必重复创建JsonSerializer / JsonDeserializer来处理每种情况。@JsonIdentityInfo批注非常接近,但由于我知道,它将始终对完整的子对象进行序列化,因此略微遗漏了该标记。 这是我想做的一个例子。给定的类: 我希望Order可以序列

  • 我的JSON字符串是: 我想要实现的是,当JSON中没有提供schemaVersion时,能够在默认情况下反序列化到SubClassV1,但即使在Superclass中将schemaVersion初始化为“1.0”时,我仍然会收到以下错误:

  • 我需要反序列化以下json: 将它的< code>id属性设置为< code>foo_id json属性。 我需要在自定义反序列化程序中执行此操作。实现这一点最简单的方法是什么? 我想以某种方式将json“转换”为 然后将此委托给杰克逊。 在本例中,对象的类型为Foo,但其他对象可能不属于此类。另外,在本例中,json是一个数字,但如果它也是一个字符串,我希望支持。所以,我需要一种通用的方法来做到

  • 我有一个POJO类,它将从JSON反序列化,JSON在Spring中作为请求体出现。此POJO类包含列表 我的JSON对象如下所示 下面是示例方法调用 我遵循了给出的建议,下面给出了反序列化程序代码

  • 我正在尝试使用RestTemplate使用REST服务。我无法反序列化JSON响应。我正在使用一个自定义反序列化程序,我的JSON有3个节点,但看起来只有一个节点到达反序列化程序。以下是更多详细信息。 以下是JSON的响应: 我正在使用@jsondeselizer对属性Hello的响应类使用自定义反序列化器。 当我执行如下readTree时: 它到达了反序列化方法,看起来它只有一个节点,而不是下面