2012-08-03 98 views
42

我想知道如果@JsonTypeInfo注释可以用于接口。我有一系列应该被序列化和反序列化的类。杰克逊注释中的多态性:@JsonTypeInfo用法

这是我想要做的。我有两个实现类Sub1,Sub2实施MyInt。某些模型类具有实现类型的接口引用。我想反序列化对象基于多态性

@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{ 
} 

我得到以下JsonMappingException

意外令牌(END_OBJECT),预计FIELD_NAME:需要JSON字符串 包含类型ID

+0

你看到了吗? http://jackson-users.ning.com/forum/topics/mapper-not-include-type-in​​formation-when-serializing-object-why?xg_source=activity你有没有提及类型的任何列表像在其他讨论线? – 2012-08-04 04:44:17

+1

我认为你需要展示更多的代码(如何进行序列化,反序列化)以及生成/消费JSON。 – StaxMan 2012-08-04 17:58:55

回答

40

@ JsonSubTypes.Type必须具有类似的值和名称,

@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") 

    }) 

在子类中,使用@JsonTypeName("dog")来表示名称。

'dog'和'cat'的值将在名为'type'的属性中设置。

+0

感谢您的回复。但是,我仍然遇到同样的错误。你认为我应该改变@JsonTypeInfo中的任何东西吗? – Chris 2012-08-03 15:20:59

+2

有没有人知道JsonTypeInfo是否可以应用于接口? – Chris 2012-08-03 16:32:17

+0

问题可能与您的输入json字符串有关。你想要发布什么? – 2012-08-03 16:37:45