覆盖@JsonTypeInfo时,如果将它用于List <animal>这样的类字段,其中Animal用它注释</animal>

时间:2012-09-05 07:02:51

标签: json jackson

我在特定情况下面临覆盖 @JsonTypeInfo 注释的问题。

请查看我的课程结构如下。

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY,    
property = "@type")
class Animal {
    public String name = "animalName";

    /**
     * @return the name
     */ 
    public String getName() {
   return name;
    }

    /**
     * @param name
     *            the name to set
     */

    public void setName(String name) {
    this.name = name;
    }

}

class Cat extends Animal {
boolean likesCream = true;
public int lives = 10;

/*
 * (non-Javadoc)
 * 
 * @see java.lang.Object#toString()
 */
@Override
public String toString() {
return "Cat [likesCream=" + likesCream + ", lives=" + lives + ", name="
    + name + "]";
}

/**
 * @return the likesCream
 */
public boolean isLikesCream() {
return likesCream;
}

/**
 * @param likesCream
 *            the likesCream to set
 */
public void setLikesCream(boolean likesCream) {
this.likesCream = likesCream;
}

/**
 * @return the lives
 */
public int getLives() {
return lives;
}

/**
 * @param lives
 *            the lives to set
 */
public void setLives(int lives) {
this.lives = lives;
}

}

class Dog extends Animal {
public double barkVolume; // in decibels

/*
 * (non-Javadoc)
 * 
 * @see java.lang.Object#toString()
 */
@Override
public String toString() {
return "Dog [barkVolume=" + barkVolume + ", name=" + name + "]";
}

/**
 * @return the barkVolume
 */
public double getBarkVolume() {
return barkVolume;
}

/**
 * @param barkVolume
 *            the barkVolume to set
 */
public void setBarkVolume(double barkVolume) {
this.barkVolume = barkVolume;
}

}

现在我在 Zoo 类中使用上面的类,我需要序列化/反序列化。

class Zoo2i {

    List<Animal> animals;

    Dog dog;

    /**
     * @return the animals
     */
    public List<Animal> getAnimals() {
    return animals;
    }

    /**
     * @param animals
     *            the animals to set
     */
    @JsonTypeInfo(use = JsonTypeInfo.Id.NONE, include = JsonTypeInfo.As.PROPERTY,    
                 property = "@type")
   public void setAnimals(List<Animal> animals) {
   this.animals = animals;
   }

    /**
     * @return the dog
     */
    public Dog getDog() {
    return dog;
    }

    /**
     * @param dog
     *            the dog to set
     */
    @JsonTypeInfo(use = JsonTypeInfo.Id.NONE, include = JsonTypeInfo.As.PROPERTY,    
                  property = "@type")
     public void setDog(Dog dog) {
    this.dog = dog;
    }
}

由于我注释了Animal类,它默认会向所有子类添加类型信息以支持多态。

列表可以包含所有类型,例如Animal,Dog,Cat。 我的要求是我不想要List中的Animal实例本身的类型信息以及zoo2i类中Dog类型的其他属性。

我成功覆盖了setDog(....)的注释,但是setAnimals(...)失败了(请参阅Zoo2i类)。

在反序列化过程中,是否有任何不同的方法可以为已注释的类本身排除类型信息或使类型信息成为可选(非强制)。

默认情况下,动物及其所有实例使用的另一件事是,包含类型信息,因为Animal已注释,我希望只有当我直接使用Cat时,Dog才会包含类型信息,不应该包含在内在反序列化期间;

1 个答案:

答案 0 :(得分:1)

我不认为这是一个受支持的用例:您应该在基类型上使用@JsonTypeInfo,在属性上使用OR(对于未注释的类型)。不要尝试混合方法。一种类型应该包括类型信息还是不包括 - 在某些情况下尝试以某种方式执行,而在其他情况下尝试以其他方式执行,这听起来像是一种危险的微优化。