杰克逊反序列化错误:MismatchedInputException

时间:2019-04-05 05:56:39

标签: java spring jackson jackson-databind

我有以下课程

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(尽管至少   存在一个创建者):无法从对象值反序列化(否   [资料来源:   (String)“ {” id“:” 56c7b5f7-115b-4cb9-9658-acb7b849d5d5“}”;行:1   栏:2]

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

2 个答案:

答案 0 :(得分:2)

您需要将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如何使用Cart创建@JsonCreator类的实例以及如何使用{{1}设置属性值}。

答案 1 :(得分:1)

您应该添加一个普通的构造函数,而没有这样的参数:

public Cart() { }