杰克逊在反序列化多态对象时会抱怨

时间:2017-10-27 11:52:08

标签: java json spring jackson deserialization

我有以下层次结构:

@Entity
@Table(name = "...")
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type", visible = true, defaultImpl = A.class)
@JsonSubTypes({ @JsonSubTypes.Type(value = B.class, name = "B") })
public abstract class Base implements IJPAEntity<String>, Jsonable {
/*
   implementation
*/
}


@Entity
@Table(name = "...")
public class A extends Base {
/*
   implementation
*/
}


@Entity
@Table(name = "...")
public class B extends Base {
/*
   implementation
*/
}

每当我进行以下反序列化时,一切都很好:

String testJSON = "{\"id\": \"someId\",\"description\": \"someDescription\",\"type\": \"B\"}";
Base b = new ObjectMapper().readValue(testJSON, Base.class);

杰克逊成功地将JSON字符串反序列化为 B 对象,并指定类型为 Base 的引用。

但是我尝试进行相同类型的反序列化的那一刻,但对于一个集合,我得到一个例外:

String testJSON = "[{\"id\": \"someId\",\"description\": \"someDescription\",\"type\": \"B\"}, {\"id\": \"anotherId\",\"description\": \"anotherDescription\",\"type\": \"B\"}]";
List<Base> list = new ObjectMapper().readValue(testJSON, new TypeReference<List<Base>>(){});
  

org.springframework.cloud.cloudfoundry.com.fasterxml.jackson.databind.JsonMappingException:无法构造com.mycomp的实例...基础,问题:抽象类型要么需要映射到具体类型,要有自定义反序列化器,或使用其他类型信息进行实例化

换句话说,当我尝试将包含不同类型对象的JSON数组反序列化为基类型Jackson的容器时,会抛出异常。

我尝试过调整很多东西,但似乎没有解决它。

任何想法都将不胜感激!

0 个答案:

没有答案