Jackson deserialization error: MismatchedInputException

Jackson deserialization error: MismatchedInputException

我有以下class

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: Cannot construct instance of com.store.domain.model.Cart (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (String)"{"id":"56c7b5f7-115b-4cb9-9658-acb7b849d5d5"}"; line: 1, column: 2]

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

您应该添加一个没有任何参数的普通构造函数,如下所示:

public Cart() { }

您需要将 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 方法创建任何 class 的实例。
由于您的 bean 是不可变的,即没有默认构造函数和 setter,您需要明确告诉 Jackson 如何使用 @JsonCreator 创建 Cart class 的实例以及如何使用 @JsonProperty.

设置属性值