2013-12-10 64 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