Java 为什么可以’;t Jackson是否使用RequiredArgsConstructor反序列化单个字段类?

Java 为什么可以’;t Jackson是否使用RequiredArgsConstructor反序列化单个字段类?,java,json,jackson,deserialization,lombok,Java,Json,Jackson,Deserialization,Lombok,如果我有一个使用Lombok的类: @RequiredArgsConstructor @Getter class Example { private final String id; } 并尝试从 { “id”: “test” } Jackson抛出了一个异常,尽管至少提供了一个创建者,但它无法反序列化 如果我随后向该类添加另一个final String字段,并将该字段添加到JSON中,则该字段将被反序列化,没有任何问题 有人知道这里发生了什么吗?如果只有一个字段,为什么不能反序列化

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

@RequiredArgsConstructor
@Getter
class Example {
  private final String id;
}
并尝试从

{
  “id”: “test”
}
Jackson抛出了一个异常,尽管至少提供了一个创建者,但它无法反序列化

如果我随后向该类添加另一个
final String
字段,并将该字段添加到JSON中,则该字段将被反序列化,没有任何问题


有人知道这里发生了什么吗?如果只有一个字段,为什么不能反序列化?

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

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

所以,若你们并没有使用lombok构造函数,那个么构造函数看起来就像

@JsonCreator
公共示例(@JsonProperty(“id”)字符串id){
this.id=id;
}
如果您不想手动编写构造函数,请继续使用@Tashkhhisi的答案

此外,我高度怀疑是否会发生以下情况。你能用代码更新这个问题吗

然后,如果我将另一个字符串字段添加到该类中,并将该字段添加到JSON中,则该字段将被反序列化,没有任何问题


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

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

所以,若你们并没有使用lombok构造函数,那个么构造函数看起来就像

@JsonCreator
公共示例(@JsonProperty(“id”)字符串id){
this.id=id;
}
如果您不想手动编写构造函数,请继续使用@Tashkhhisi的答案

此外,我高度怀疑是否会发生以下情况。你能用代码更新这个问题吗

然后,如果我将另一个字符串字段添加到该类中,并将该字段添加到JSON中,则该字段将被反序列化,没有任何问题


不确定这是否真的是问题所在,但在您的示例JSON中有“奇怪的”双引号。如果我将这个JSON粘贴到JSON验证器中,那么它会给我一个解析错误。如果我更正了双引号,那么它解析的很好。这就是我在手机上输入问题的地方。测试时,它肯定是正确的引号。你确定它有效吗->如果我随后向该类添加另一个最后的字符串字段,并将该字段添加到JSON,它将被反序列化,没有任何问题。?不确定这是否真的是问题所在,但在你的JSON示例中,你有“奇怪的”双引号。如果我将这个JSON粘贴到JSON验证器中,那么它会给我一个解析错误。如果我更正了双引号,那么它解析的很好。这就是我在手机上输入问题的地方。在测试时,它绝对是正确的引号。你确定它有效吗?->如果我随后向该类添加另一个最后的字符串字段,并将该字段添加到JSON,它将被反序列化,没有任何问题。?