在Jackson创建一个工厂JSON反序列化器

时间:2013-12-10 19:37:18

标签: json jackson deserialization

我有一堆接口注释如下:

@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();

1 个答案:

答案 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);

我希望这足以让你到达你需要的地方!