com.faster xml .jackson.databind.JsonMappingException не может создать экземпляр класса - PullRequest
3 голосов
/ 13 марта 2020
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>"
}

Ответ содержит более 100 * *

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

Есть ли Как мы можем создать экземпляр класса, который содержит объект абстрактного класса?

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Это будет включать имя класса как JSON свойство "class".

@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 }
]}

аналогичные логики c могут использоваться для вышеупомянутой проблемы, для которой нам нужно add some additional info в JSON .

0 голосов
/ 13 марта 2020

Поскольку класс B является abstract class, необходимо указать тип, который можно использовать для создания экземпляра типа B. В вашем случае это класс C. Вы можете указать Jackson сделать это:

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

или на уровне поля:

@JsonProperty("B")
@JsonDeserialize(contentAs = C.class)
private List<B> b;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...