繁体   English   中英

com.fasterxml.jackson.databind.JsonMappingException 无法构造类的实例

[英]com.fasterxml.jackson.databind.JsonMappingException not able to construct instance of class

import javax.ws.rs.core.Response;

class A{
    @JsonProperty("B")
    List<B> b;
    @JsonProperty("abc")
    String abc;
}

public abstract class B{
    @JsonProperty("def")
    String def;
}

public class C extends B{
    @JsonProperty("xyz")
    String xyz;
}

json:

{
  "B": [
    {
      "def": "<text1>"
    },
    {
      "def": "<text1>",
      "xyz": "<text2>"
    }
  ],
  "abc": "<text3>"
}

响应具有上述json内容

A a  = response.readEntity(A.class);

错误:

javax.ws.rs.client.ResponseProcessingException:` Problem with reading the data, class A, ContentType: application/json.
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of B: abstract types either need to be mapped

有什么办法可以创建一个包含抽象类对象的类实例?

因为类B是一个abstract class您需要提供可用于实例化B类型的类型。 在您的情况下是C类。 您可以通过以下方式指示Jackson这样做:

@JsonDeserialize(as = C.class)
abstract class B {

或在现场级别:

@JsonProperty("B")
@JsonDeserialize(contentAs = C.class)
private List<B> b;

这将包括类名作为 JSON 属性“类”。

@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="class")
public abstract class B {
}

public class C extends B {
  public int x;
}
public class D extends B {
  public String name;
}

public class A {
  public List<B> items;
}
and this could result in serialized JSON like:

{ "items" : [
  { "class":"D", "name":"TXT" },
  { "class":"C", "x":123 }
]}

类似的逻辑可用于上述问题,因为我们需要在 JSON 中add some additional info

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM