2013-12-10 206 views
2

创建一个工厂JSON解串器我有一大堆的注释界面如下:杰克逊

@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

我希望我有一个完整的答案给你。杰克逊可以通过MixIn来做到这一点。我并不是这方面的专家,但最近我做到了......所以......本质上,您将类型信息粘贴到JSON中,然后Jackson可以使用该类型信息以您想要的方式将其反序列化。

所以首先,你需要一个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类派生自相同的基类在我的情况。所以我坚持进出杰克逊的一切都是一种类型。说那个基类是MyBaseClass。

因此,然后在你的杰克逊类,你需要告诉对象映射关于此。

private ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.addMixInAnnotations(MyBaseClass.class, PolymorphicMixIn.class); 

就是这样。现在你可以调用objectMapper.writeValueAsString,它会写出杰克逊并坚持输入信息。

要读出来,只是通过在类类型你期望:

MyString outputString = objectMapper.readValue(argAsString, MyString.class); 

我希望这是足以让你在哪里,你需要的!

+0

这不需要我用'@ MyAnnotaiton'为每个接口创建一个mixin吗?这是不可取的。我希望能够轻松地添加使用'@ MyAnnotation'注释的新接口。另外,这需要我修改JSON表示。这在我的设置中也是不可取的。这就是我相信我的反序列化器需要某种形式的工厂的原因(即,基于'@ MyAnnotation'注释,即时创建反序列化器的一种方式) – aioobe