Spring @RequestBody包含不同类型的列表(但是相同的接口)

Vik*_* K. 18 java spring json spring-mvc

假设我有一个域类:

    public class Zoo{
        private List<Animal> animals;
        ....
Run Code Online (Sandbox Code Playgroud)

其中Animal是具有不同实现的接口(Cat,Dog).假设我希望能够保存Zoo对象:

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

我想发送一个json - 类似于:

    {
        animals:[
            {type:'Cat', whiskers-length:'3'},
            {type:'Dog', name:'Fancy'}
        ]
    }
Run Code Online (Sandbox Code Playgroud)

当键入=='Cat'时,如何告诉spring MVC将动物映射到Cat类型,并在键入=='Dog'时将其映射到Dog类?

nic*_*ild 21

您应该使用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 {

}
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很适合2种亚型(猫和狗),但如果你有一个庞大的子类型列表怎么办?动物园里有更多类型的动物:) (3认同)
  • 如果您不想丢失json中的属性“ type”,@ JsonTypeInfo(use = Id.NAME,include = As.PROPERTY,属性=“ type”,visible = true),请不要忘记visible = true (2认同)

Pra*_*cer 5

现在有一个更简单的注释:

@JsonRootName("dog")
public class Dog extends Animal {...}
Run Code Online (Sandbox Code Playgroud)

注释的参考可以在fastxml.github找到