这是我在相同情况下所做的:
@JsonDeserialize(using = InstanceDeserializer.class)public abstract class Instance { //.. methods}@JsonDeserialize(as = UserInstance.class)public class UserInstance extends Instance { //.. methods}@JsonDeserialize(as = HardwareInstance.class)public class HardwareInstance extends Instance { //.. methods}public class InstanceDeserializer extends JsonDeserializer<Instance> { @Override public Instance deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { ObjectMapper mapper = (ObjectMapper) jp.getCodec(); ObjectNode root = (ObjectNode) mapper.readTree(jp); Class<? extends Instance> instanceClass = null; if(checkConditionsForUserInstance()) { instanceClass = UserInstance.class; } else { instanceClass = HardwareInstance.class; }if (instanceClass == null){ return null; } return mapper.readValue(root, instanceClass ); }}您注释
Instance与
@JsonDeserialize(using =InstanceDeserializer.class)指示类可用于反序列化的抽象类。然后,您需要指示每个子类将
as自己反序列化,否则它们将使用父类反序列化器,并且您将获得
StackOverflowError。
最后,在内部,
InstanceDeserializer您将逻辑反序列化为一个或另一个子类(
checkConditionsForUserInstance()例如)。



