2013-06-22 33 views
14

比方说,我有一个域类:含有不同类型的(但相同的接口)的列表春@RequestBody

public class Zoo{ 
     private List<Animal> animals; 
     .... 

,其中的动物以不同的实现(猫,狗)的接口。比方说,我希望能够保存一个动物园对象:

@RequestMapping(value = "/zoo", method = RequestMethod.POST) 
    public @ResponseBody void save(@RequestBody Zoo zoo) { 
    .... 

,我想送一个JSON - 是这样的:

{ 
     animals:[ 
      {type:'Cat', whiskers-length:'3'}, 
      {type:'Dog', name:'Fancy'} 
     ] 
    } 

我怎么能告诉Spring MVC的动物映射到猫当键入=='Cat'时键入,并在键入=='Dog'时将其映射到Dog类?

+0

对不起被发现无效的JSON的混乱。但它仍然不能解决我的问题,即从json对象{type:'Cat',whiskersLength:'3'}到Cat类的映射。动物园类只知道动物列表包含动物。但是,json反序列化器如何知道用于特定json对象的Animal接口(Dog或Cat)的哪个实现? –

回答

15

您应该使用Jackson注释@JsonTypeInfo@JsonSubTypes来实现多态json。注释位于Animal基类上。

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type") 
@JsonSubTypes({@JsonSubTypes.Type(value = Dog.class, name = "Dog"), 
     @JsonSubTypes.Type(value = Cat.class, name = "Cat")}) 
public abstract class Animal { 

} 
+0

这个工程!非常感谢你! –

+3

这对于2种亚型(猫和狗)来说看起来很棒,但是如果你有一个庞大的亚型列表呢?动物园里有更多类型的动物:) – Wouter

+1

是否可以在Cat或Dog上添加一些注释,而不在动物身上放置'@ JsonSubTypes'? – dmitryvim

3

现在有一个更简单的标注出来:

@JsonRootName("dog") 
public class Dog extends Animal {...} 

以注释的参考可以在fasterxml.github

相关问题