为什么 Jackson 不能使用RequiredArgsConstructor 反序列化单个字段类?

Mat*_*att 5 java json jackson lombok deserialization

如果我有一个使用 Lombok 的课程:

\n\n
@RequiredArgsConstructor\n@Getter\nclass Example {\n  private final String id;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并尝试将其反序列化

\n\n
{\n  \xe2\x80\x9cid\xe2\x80\x9d: \xe2\x80\x9ctest\xe2\x80\x9d\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

如果我再添加另一个final String向该类添加另一个字段,并将该字段添加到 JSON,则它会被反序列化,不会出现任何问题。

\n\n

有谁知道\xe2\x80\x99s 这里发生了什么?如果只有一个字段,为什么无法反序列化?

\n

Smi*_*ile 0

当初始化对象属性的唯一方法是通过构造函数时,杰克逊需要被告知应该通过@JsonCreator注释使用构造函数进行反序列化。

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

因此,如果您不使用 lombok 构造函数,那么构造函数将如下所示

    @JsonCreator
    public Example (@JsonProperty("id") String id) {
        this.id = id;
    }
Run Code Online (Sandbox Code Playgroud)

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

另外,我非常怀疑是否会发生以下情况。您可以用显示此内容的代码更新问题吗?

如果我随后向该类添加另一个最终 String 字段,并将该字段添加到 JSON,则它会被反序列化,不会出现任何问题。

  • 确实,添加额外的字符串字段可以解决问题,Jackson 对单字段对象有问题,请参阅此 github 问题:https://github.com/FasterXML/jackson-databind/issues/1498 (2认同)