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

为什么杰克逊不能使用必需的ArgsConstructor反序列化单个字段类?

苏培
2023-03-14

如果我有一个使用Lombok的类:

@RequiredArgsConstructor
@Getter
class Example {
  private final String id;
}

并尝试将它从

{
  “id”: “test”
}

Jackson抛出了一个异常,尽管至少提供了一个创建者,但它不能反序列化。

然后,如果我向该类添加另一个最终字符串字段,并将该字段添加到 JSON,则该字段将被取消序列化,没有任何抱怨。

有谁知道这是怎么回事?如果只有一个字段,为什么无法反序列化?

共有1个答案

商昆琦
2023-03-14

当初始化对象属性的唯一方法是通过构造器时,需要告诉 Jackson,反序列化应该通过使用构造函数通过@JsonCreator注释来实现。

此外,所有属性名称都应通过@JsonProperty注释提供,因为Jackson需要知道在构造器中传递的属性序列才能正确地将json值映射到Java对象属性。

因此,如果您没有使用lombok构造函数,那么构造函数将看起来像

    @JsonCreator
    public Example (@JsonProperty("id") String id) {
        this.id = id;
    }

如果您不想手动编写构造器,请继续使用@tashkhisi的答案。

此外,我非常怀疑以下情况会发生。你能用显示这一点的代码更新问题吗?

如果我随后向该类添加另一个最后的字符串字段,并将该字段添加到JSON中,它将被反序列化,不会有任何问题。

 类似资料:
  • 这是密码 输出量 我的问题是: 为什么jackson在完成构建后修改了没有setter的私有final字段?如果这是有意的,我该如何关闭它 非常感谢。

  • 问题内容: 我有以下课程- 我正在使用objectMapper.valueToTree(sections)将其转换为JsonNode。但是,当我打印相同的内容时,我仅从Entity类中看到id和name字段,而从Images列表中看不到任何内容。我是否需要添加任何种类的特殊逻辑或注释以确保同时打印列表。 以下是主要课程- 问题答案: 您需要为Entity#images添加getter和setter

  • 问题内容: 我有一个JSON字符串,将标记为而不是。因此,例如,如果我有一个没有子对象的对象,我将收到类似以下的字符串: 我想将其反序列化为Parent类,并将子级正确设置为一个空的子级列表。 对于上述JSON字符串,我想要一个对象,其设置为,而设置为。 我会知道如何在整个课堂上使用注释 然后 但是,我想解决一个从字符串正确实例化List的一般问题: 我能得到类似的东西吗? 问题答案: 几个选择;

  • 问题内容: 我想反序列化JSON对象中的任何未知字段,作为pojo成员的映射中的条目。 例如json 和pojo 有没有办法用杰克逊配置它?如果不是,是否有一种有效的方法编写a 来做到这一点(假设in中的值可以是更复杂但众所周知的一致类型)? 问题答案: 有一个功能和一个注释正好适合此目的。 经过测试,它可以像您的示例一样使用UUID: 它将像这样工作: 同样,更常见的类型(例如字符串)也可以工作

  • 我正在调用一个返回JSON的endpoint,它看起来像这样(在Postman中): 此请求返回的Content-Type头是(与通常的 类来自外部库(编写这个endpoint的人)。无论如何,当我试图通过< code > rest template . exchange()调用这个endpoint时,Jackson都无法将这个JSON反序列化为一个有效的< code>Result类。我正在这样做

  • 问题内容: 我有一个Java类,我对从JSON反序列化感兴趣。我已经配置了一个特殊的MixIn类,以帮助我进行反序列化。只有和实例变量与适当的getter和setter方法相结合。看起来像这样: 在我的测试客户端中,我执行以下操作,但是在编译时它当然不起作用,因为与类型不匹配有关。 我知道我可以通过创建一个仅包含一个“响应”对象的方法来缓解此问题,但是随后我将不得不为我想返回的每种类型创建这些有点