我有一堆接口注释如下:
@MyAnnotation(DefaultImplementation.class)
interface SomeInterface {
...
}
以及随附的实施
class DefaultImplementation implements SomeInterface {
...
}
当我的ObjectMapper遇到SomeInterface
类型的字段时,我希望它将其反序列化,就像它是DefaultImplementation
一样。也就是说,我想在反序列化过程中编码以下逻辑:
if (staticTypeToDeserialize.isAnnotationPresent(MyAnnotation.class))
deserializeAs(type.getAnnotation(MyAnnotation.class).value());
else
fallBackOnRegularDeserialization();
答案 0 :(得分:0)
我希望我能给你一个完整的答案。杰克逊可以通过MixIn来做到这一点。我不是那么专家,但我最近这样做了......实际上,你将类型信息粘贴到JSON中,然后杰克逊可以使用该类型信息以你想要的方式反序列化它。
首先,您需要一个mixin类,它知道您要序列化和反序列化的类型。
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = MyString.class, name = "mystring"),
@JsonSubTypes.Type(value = MyEvent.class, name = "myevent") })
public abstract class PolymorphicMixIn {
}
在我的情况下,MyString和MyEvent类派生自相同的基类。因此,我坚持进出Jackson的一切都是一类。假设baseclass是MyBaseClass。
那么在你的杰克逊课程中,你需要告诉对象映射器。
private ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixInAnnotations(MyBaseClass.class, PolymorphicMixIn.class);
这就是它。现在你可以调用objectMapper.writeValueAsString,它会写出Jackson并坚持输入类型信息。
要阅读它,只需传入您期望的类类型:
MyString outputString = objectMapper.readValue(argAsString, MyString.class);
我希望这足以让你到达你需要的地方!