Jackson ObjectMapper 无法反序列化 POJO,抛出异常:没有找到适合类型 [...] 的构造函数:无法从 JSON 对象实例化

Posted

技术标签:

【中文标题】Jackson ObjectMapper 无法反序列化 POJO,抛出异常:没有找到适合类型 [...] 的构造函数:无法从 JSON 对象实例化【英文标题】:Jackson ObjectMapper cannot deserialize POJO, throws an exception: No suitable constructor found for type [...]: can not instantiate from JSON object 【发布时间】:2012-10-06 16:12:35 【问题描述】:

我已尝试测试以下代码,但没有成功:

class TestClass

  private class ND2Customer
  
    public String name;
    public String description;
    public String email;
    public Boolean multiuser;

    public String dnszone;
    public String uri;
    public String type;

    public ND2Customer()
    

    
  

  @Test
  public void TestJackson() throws JsonParseException, JsonMappingException, IOException
  
    String json="\"description\": \"test1u\", \"dnszone\": \"test1.public.sevenltest.example.com.\", \"uri\": \"http://199.127.129.69/customer/test1\", \"multiuser\": true, \"type\": \"2.0.3-3146\", \"email\": \"test1@com.com\", \"name\": \"test1\"";
    ObjectMapper mapper = new ObjectMapper();

    ND2Customer casted=mapper.readValue(json, ND2Customer.class);

    String castedback=mapper.defaultPrettyPrintingWriter().writeValueAsString(casted);
    System.out.println(castedback);
   

这个问题与这个不同: Deserializing JSON with Jackson - Why JsonMappingException "No suitable constructor"?

还有这个: JsonMappingException: No suitable constructor found for type [simple type, class ]: can not instantiate from JSON object

还有这个: JsonMappingException: No suitable constructor found for type [simple type, class ]: can not instantiate from JSON object

因为我手动覆盖了默认构造函数,它不是子类。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

使其成为静态的。 Jackson 无法反序列化为内部类

【讨论】:

谢谢,它有效。您的解决方案非常合理,因为 Jackson 映射器无法初始化内部类并返回它。 小补充:Jackson 实际上可以反序列化一种非静态内部类——那些被父类直接引用的。但这不是这里的情况,因为 Test 类没有被序列化。在这种情况下,非静态可能是偶然的。 我敢打赌,嵌套 POJO 的大多数“没有合适的构造函数”问题都是因为忘记将其标记为静态。谢谢尤金!【参考方案2】:

问题可能是 Jackson 无法正确访问您的 ND2Customer 类来调用其构造函数,因为它是 private,否则您的类看起来还不错。尝试将其设为public,看看是否可行。

【讨论】:

抱歉,我忘了说 ND2Customer 是在 @Test public void TestJackson() 之前定义的嵌套类。 将其更改为公开并没有什么不同:) “它是一个内部类”是高度相关的……

以上是关于Jackson ObjectMapper 无法反序列化 POJO,抛出异常:没有找到适合类型 [...] 的构造函数:无法从 JSON 对象实例化的主要内容,如果未能解决你的问题,请参考以下文章

Jackson ObjectMapper 无法反序列化 POJO,抛出异常:没有找到适合类型 [...] 的构造函数:无法从 JSON 对象实例化

理解异常的麻烦:“无法从 START_OBJECT 令牌中反序列化 `java.lang.String` 的实例”在 Jackson 中使用 ObjectMapper

Spring Boot 不使用配置的 Jackson ObjectMapper 和 @EnableWebMvc

Jackson ObjectMapper类使用解析

导致原因:升级到Java 11后,IntelliJ中的com.fasterxml.jackson.databind.ObjectMapper。java.lang.ClassNotFoundExcept

jackson objectMapper 与其他人的区别