簡體   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