【问题标题】:Jackson deserialization error: MismatchedInputException杰克逊反序列化错误:MismatchedInputException
【发布时间】:2019-08-26 23:34:11
【问题描述】:

我有以下课程

public class Cart {
    private final String id;

    public Cart(String id) { this.id = id;}

    public String getId() { return id; }
}

还有以下测试:

    String jsonString = "{\"id\":\"56c7b5f7-115b-4cb9-9658-acb7b849d5d5\"}";
    Cart cart = mapper.readValue(jsonString, Cart.class);
    assertThat(cart.getId()).isEqualTo("56c7b5f7-115b-4cb9-9658-acb7b849d5d5");

我收到以下错误:

com.fasterxml.jackson.databind.exc.MismatchedInputException: 不能 构造实例 com.store.domain.model.Cart(尽管至少 一个 Creator 存在):无法从 Object 值反序列化(没有 基于委托或基于属性的创建者)在 [来源: (字符串)"{"id":"56c7b5f7-115b-4cb9-9658-acb7b849d5d5"}";线:1, 栏目:2]

我不知道这里出了什么问题。有什么帮助吗?

【问题讨论】:

  • 检查构造函数,是否有私有构造函数?如果是,并且您希望保持这种状态,那么您必须重写该对象的转换方式。
  • 无论何时创建任何参数化构造函数,都始终创建默认构造函数。

标签: java spring jackson jackson-databind


【解决方案1】:

您需要将 bean 定义为:

public class Cart {
    private final String id;

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

    public String getId() { return id; }
}

public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    String jsonString = "{\"id\":\"56c7b5f7-115b-4cb9-9658-acb7b849d5d5\"}";
    Cart cart = mapper.readValue(jsonString, Cart.class);
    System.out.println(mapper.writeValueAsString(cart));
}

输出

{"id":"56c7b5f7-115b-4cb9-9658-acb7b849d5d5"}

默认情况下,Jackson 使用默认构造函数和 setter / getter 方法创建任何类的实例。
由于您的 bean 是不可变的,即没有默认构造函数和设置器,您需要明确告诉 Jackson 如何使用 @JsonCreator 创建 Cart 类的实例以及如何使用 @JsonProperty 设置属性值。

【讨论】:

  • 这对我有一个 Kotlin 数据类在其主要构造函数中只有一个参数的情况有所帮助。
【解决方案2】:

你应该添加一个没有任何参数的普通构造函数:

public Cart() { }

【讨论】:

  • 在不可变 bean 的情况下无济于事。
猜你喜欢
  • 2017-04-25
  • 2017-12-26
  • 2015-04-07
  • 1970-01-01
  • 2019-07-05
  • 2012-11-19
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多