您似乎忘记用 @JsonDeserialize(using = ImplementationClazz.class) 注释您的实现类,以表明该类应该用于反序列化抽象类或接口。
以下是使用 Jackson 反序列化具有多个实现的接口的简单示例。
这是我的界面:
@JsonDeserialize(using = UserDeserializer.class)
public interface User {
}
接口的一种实现:
@JsonDeserialize(as = ServiceUser.class)
public class ServiceUser implements User{
private String name;
private String role;
//constructor, setters & getters
第二次实施:
@JsonDeserialize(as = AdminUser.class)
public class AdminUser implements User {
private String role;
private String designation;
//constructor, setters & getters
这里是反序列化器:
public class UserDeserializer extends JsonDeserializer<User> {
@Override
public User deserialize(JsonParser jp, DeserializationContext context) throws IOException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = mapper.readTree(jp);
/*write your own condition*/
if (root.has("name") && root.get("name").asText().equals("XYZ")) {
return mapper.readValue(root.toString(), ServiceUser.class);
}
return mapper.readValue(root.toString(), AdminUser.class);
}
}
如果您不对实现类进行注释,您可能会收到 StackOverflowError。所有实现类都应该反序列化自己,否则它将使用父类中的反序列化器,这会导致 StackOverflowError。