java - jackson 未能反序列化简单的 JSON

标签 java json jackson

我正在使用 Lombok,@Annotations 为我创建 getter、setter 和构造函数。我还有许多其他类, jackson 可以轻松反序列化。这是我要反序列化的对象:

@Value
@Builder
public class RecipeListRemoveDTO {
    int recipeListId;
}

在以下 Controller 方法中使用:

@DeleteMapping(path="/deleteRecipeListFromUser")
public @ResponseBody String deleteRecipeListFromUser(@RequestBody RecipeListRemoveDTO recipeListRemoveDTO) {
    return recipeListService.removeRecipeListFromUser(recipeListRemoveDTO);
}

以及我发送的 JSON:

{
    "recipeListId": 2
}

但我收到错误:

“消息”:“JSON 解析错误:无法构造 com.prepchef.backend.models.dto.RecipeListRemoveDTO 的实例(尽管至少存在一个创建者):无法从对象值反序列化(无委托(delegate)或属性-based Creator); 嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of com.prepchef.backend.models.dto.RecipeListRemoveDTO (although at least one Creator exists): cannot deserialize from Object value ( [Source: (PushbackInputStream); line: 2, column: 5] 处没有基于委托(delegate)或基于属性的 Creator)

有人知道为什么会这样吗?

最佳答案

Jackson 不知道它应该使用 Lombok 生成的构建器。 可能最简单的解决方案是用 Lombok's @Jacksonized annotation 注释你的类(自 Lombok 以来可用 1.18.14).

@Value
@Builder
@Jacksonized
public class RecipeListRemoveDTO {
    int recipeListId;
}

在幕后,@Jacksonized 注释导致 Lombok 做以下事情(这样你就不需要做这些 手动):

  • 它添加了@JsonDeserialize(builder=RecipeListRemoveDTO.RecipeListRemoveDTOBuilder.class) 到你的类(class),让 jackson 知道它应该使用 反序列化的构建器。
  • 它将 @JsonPOJOBuilder(withPrefix="") 添加到构建器类, 这样 Jackson 就知道构建器方法有一个名字 不是以 with 开头。

关于java - jackson 未能反序列化简单的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69490052/

相关文章:

java - jackson-dataformat-avro 错误

java - 在 Java 中实现 Scala PartialFunction 的最简单方法是什么?

java - 带有 DFC 代码的 Jython

java - 即使卸载旧的 apk,Android APK 安装也失败

javascript - 如何遍历 JSON obj 的属性?

java - Android中使用Gson@SerializedName注解的基本目的是什么

java - map 上的 jackson 补丁对象

java - HBase put [util.List [Put])不起作用

javascript - 如何在 JavaScript 中从 json 中获取特定数据?

用于反序列化具有可变小数秒数的日期的 Java 日期模式?