2012-08-03 10 views
42

Chciałbym wiedzieć, czy adnotacja @JsonTypeInfo może być używana dla interfejsów. Mam zestaw klas, które powinny być serializowane i deserializowane.Polimorfizm w adnotacjach jackson: użycie @ JsonTypeInfo

Oto, co próbuję zrobić. Mam dwie klasy implementacji Sub1, Sub2 implementujące MyInt. Niektóre klasy modeli mają odwołanie do interfejsu dla typów implementacji. Chciałbym deserializowania obiektów na podstawie polimorfizmu

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=As.WRAPPER_OBJECT) 
@JsonSubTypes({ 
    @Type(name="sub1", value=Sub1.class), 
    @Type(name="sub2", value=Sub2.class)}) 
public interface MyInt{ 
} 

@JsonTypeName("sub1") 
public Sub1 implements MyInt{ 
} 

@JsonTypeName("sub2") 
public Sub2 implements MyInt{ 
} 

uzyskać następujące JsonMappingException:

Nieoczekiwany token (END_OBJECT), oczekiwany nazwa_pola: Need JSON String zawierającą typ id

+0

widziałeś to? http://jackson-users.ning.com/forum/topics/mapper-not-include-type-information-when-serializing-object-why?xg_source=activity czy masz listę bez typu wymienionego, jak omówiono w innym wątek? –

+1

Myślę, że potrzebujesz pokazać nieco więcej kodu (jak robi się serializacja, deserializacja), jak również JSON jest produkowany/zużywany. – StaxMan

Odpowiedz

40

@ JsonSubTypes.Type musi mieć wartość i taką nazwę,

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=As.WRAPPER_OBJECT, property="type") 
    @JsonSubTypes({ 

     @JsonSubTypes.Type(value=Dog.class, name="dog"), 

     @JsonSubTypes.Type(value=Cat.class, name="cat") 

    }) 

W podklasie użyj nazwy @JsonTypeName("dog"), aby wymówić nazwę.

Wartości "pies" i "kot" zostaną ustawione w nieruchomości o nazwie "typ".

+0

Dzięki za odpowiedź. Jednak nadal mam ten sam błąd. Myślisz, że powinienem również coś zmienić w @JsonTypeInfo? – Chris

+2

Czy ktoś wie, czy JsonTypeInfo można w ogóle zastosować do interfejsów? – Chris

+0

Problem może być związany z wprowadzonym ciągiem znaków json. próbujesz coś POSTAĆ? –