当前位置: 首页 > 知识库问答 >
问题:

覆盖@JsonTypeInfo不工作时,使用它的类字段,如列表,其中动物与它一起注释

酆茂才
2023-03-14

朋友

我面临着在特定场景中覆盖@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;
    }
}

因为我已经注释了动物类,它会默认将类型信息添加到它的所有子类以支持多态性。

列表可以包含所有类型,例如动物、狗、猫。我的要求是,我不希望列表中的动物实例本身的类型信息以及zoo2i类中Dog类型的其他属性的类型信息。

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

在反序列化过程中,有没有不同的方法来排除带注释的类本身的类型信息,或者使类型信息可选(不是强制的)。

还有一件事,默认情况下,动物及其所有实例都被使用,类型信息被包含为动物被注释,我希望只有当我直接使用猫,狗时,类型信息才不应该被包含,并且在反序列化期间不应该被期望;

共有1个答案

魏宏邈
2023-03-14

我不认为这是一个受支持的用例:您应该在要使用的基类型上使用< code>@JsonTypeInfo,或者在属性上使用(对于未标注的类型)。不要尝试混合方法。一个类型应该包含或者不包含类型信息——在某些情况下试图用一种方式,在其他情况下用另一种方式,听起来像是一种危险微优化

 类似资料:
  • 我设置了一个HTTPS代理,这样HTTP客户端就可以安全地向代理发送普通HTTP请求。例如,客户机可以向代理发送加密的HTTP GET请求,代理将删除加密并将普通HTTP GET请求发送到终端站点。 我了解到这不是一个常见的设置,只有GoogleChrome具有内置功能来支持这样的场景。(信息在这里-http://wiki.squid-cache.org/Features/HTTPS#Encryp

  • 例如,当我输入firstnum=1,5; ii dnum=3,2时,它返回和。但是当我用“.”而不是“”输入数字时,它会返回错误。 有人能给我解释一下吗?在教程中,我看到guy做了同样的程序,即使他使用了带“.”的双数,它也返回了和。

  • 我试图在我的项目中实现这段代码,但不起作用RecycerView:如何捕捉ImageView上的onClick?: 我实现了一个接口来处理RecycerView中的onclick imageview和onclick row。问题是,当我试图在imageview上或在行中单击时,不会发生任何事情。如果我在我的ViewHolder类中尝试同样的方法,效果会很好,因为我可以看到祝酒词。问题是我需要这个工

  • 问题内容: 我刚刚开始使用JSF,看起来很棒,但是我似乎无法弄清楚这最后的障碍。 我习惯了传统的Jquery AJAX函数,这在我的书中很完美。但是我希望找到一种方法使其与JSF协调工作。 这是一个说明我的情况的方案。 我的网站上有一个消息传递页面,用户可以在其中互相发送消息。所以在我的xhtml页面中,我看起来像这样: 效果很好。用户可以发布他们的消息,并将其加载到上面的对话div中。但是现在我

  • 这里是我的pom.xml 4.0.0 org.springframework.Boot spring-boot-starter-parent 2.3.2.release com.king Gestpeacesecurity 0.0.1-snapshot Gestpeacesecurity用于Spring Boot的和平安全项目 我的实体代理,我使用lomback作为getter和setter 这是

  • 在android Studio中,当我运行一个简单的代码来获取一个整数时,它会给我一个关于Scanner类的错误。 我只是希望它打印一个数字,但是与eclipse和其他ide不同,它给出了一个错误。我实际上试图修改gradle,但它没有工作(也许我做错了什么,老实说我不确定)。任务执行失败':yad:MyClass.main()'。 处理“命令”C:/程序文件/Android/Android St