У меня есть JSON, который выглядит так:

{
  "totalSize": 11,
  "done": true,
  "records": [
    {
      "attributes": {
        "type": "Team_Member",
        "url": "/services/data/Team_Member/xxxx"
      },
      "Age": 48,
      "Birth_Date": "1971-05-17",
      "Business": null,
      "Citizenship": null,
      "Country": "UK",
      ...other fields...
    },
    { other records ....}
  ]
}

Объекты в массиве records могут быть разных типов, но не будут смешанными. Во время десериализации поле атрибутов можно игнорировать.

Я пытаюсь десериализовать его с Джексоном в этот класс Java:

@lombok.Data
public class QueryResult<C extends BaseObject> {
    private int totalSize;
    private boolean done;
    private List<C> records;
}

И подклассы BaseObject будут иметь обязательные поля, например:

public class TeamMember extends BaseObject {
    public int Age;
    public Date Birth_Date;
    //etc...
}

Вот код десериализации:

public <C extends BaseObject> QueryResult<C> doQuery(Class<C> baseObjectClass) {

    String json = ...get json from somewhere
    ObjectMapper mapper = new ObjectMapper();
    try {
        JavaType type = mapper.getTypeFactory().constructCollectionLikeType(QueryResult.class, baseObjectClass);
        return mapper.readValue(json, type);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

Но это не удачно, я получаю исключение:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot find a Value deserializer for type [collection-like type; class com.foo.QueryResult, contains [simple type, class com.foo.TeamMember]]

Любое предложение будет оценено.

1
NickJ 20 Дек 2019 в 18:46