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

jackson中使用的@JsonTypeInfo和@JsonSubTypes是什么

上官树
2023-03-14

Jackson中使用的注释是什么?

public class Lion extends Animal {

private String name;

@JsonCreator
public Lion(@JsonProperty("name") String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public String getSound() {
    return "Roar";
}

public String getType() {
    return "carnivorous";
}

public boolean isEndangered() {
    return true;
}

@Override
public String toString() {
    return "Lion [name=" + name + ", getName()=" + getName() + ", getSound()=" + getSound() + ", getType()=" + getType() + ", isEndangered()="
            + isEndangered() + "]";
}

}

========================================

public class Elephant extends Animal {

@JsonProperty
private String name;

@JsonCreator
public Elephant(@JsonProperty("name") String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public String getSound() {
    return "trumpet";
}

public String getType() {
    return "herbivorous";
}

public boolean isEndangered() {
    return false;
}

@Override
public String toString() {
    return "Elephant [name=" + name + ", getName()=" + getName() + ", getSound()=" + getSound() + ", getType()=" + getType()
            + ", isEndangered()=" + isEndangered() + "]";
}
}

==============================================

@JsonTypeInfo (use = JsonTypeInfo.Id.CLASS, include = As.PROPERTY, property = "classNameExtenral")
@JsonSubTypes ({@Type (value = Lion.class, name = "lion"), @Type (value = Elephant.class, name = "elephant")})

public abstract class Animal {

@JsonProperty ("name")
String name;
@JsonProperty ("sound")
String sound;
@JsonProperty ("type")
String type;
@JsonProperty ("endangered")
boolean endangered;
}

public static void main(String[] args){
    Lion lion = new Lion("Simba");
    Elephant elephant = new Elephant("Manny");
    List<Animal> animals = new ArrayList<>();
    animals.add(lion);
    animals.add(elephant);
}

我的理解是,它还保留了被序列化的对象的具体类型以及实际数据。

我不清楚的是反序列化过程中的实际优势/收益是什么。

除了java文档之外,没有任何重要的文档。任何人都可以在这里提供帮助或提供一些文件相同。

共有1个答案

蓝飞
2023-03-14

这些注释的目的是支持反序列化的多态性。当反序列化时,正在执行的实际代码将知道它期望的类。例如,某些字段的类型被反序列化。但是如果该类有子类(即子类型),通用Jackson反序列化器如何知道被反序列化的字符串是哪个实际类?它必须创建一个特定类型的实例(类或其子类之一)并填充它。它知道要创建哪个的唯一方法是如果该信息首先写入序列化中。

正如这个答案所说,有三种方法可以做到这一点——您可以选择适合您用例的方法。@JsonTypeInfo@JsonSubtype是其中一种方法——当您在编译时知道可能存在于所讨论的类的所有可能的子类型时,它会非常有效。

 类似资料:
  • 问题内容: 在jackson中使用的@JsonTypeInfo和@JsonSubTypes注释是什么? ======================================= ============================================== 我了解的是 ,它还保留了要序列化的对象的具体类型以及实际数据。 我不清楚 反序列化期间的实际优势/收益是什么。 除了Jav

  • 我的maven项目可以在GitHub中找到。

  • Jackson框架提供了基于注释的方法来在序列化过程中发出类型信息。 我不想在我的超级类(Animal)中使用@JsonSubTypes注释。 相反,我想告诉我的子类,即狗和大象,动物是它们的父母。 有没有任何方法可以在不使用动物类中的注释的情况下做到这一点。 如果是,请提供示例,如果可能的话,也可以这样做。 下面是我试图解决的问题。“test”接收的JSON包含“type”字段,如“dog”或“

  • 问题内容: 我刚刚开始使用Jackson JSON库。杰克逊(Jackson)是一个非常强大的库,但是它具有非常丰富的API。许多事情可以通过多种方式完成。这使得在Jackson很难找到自己的出路- 如何知道什么是正确/最佳的做事方式? 我为什么要使用此解决方案: 通过这样的解决方案: 或超过我使用JsonFactory和JsonParser遇到的解决方案,甚至还有更多选择… 似乎mape.rea

  • 我试图转换一些使用Jackson的@JsonSubTypes注释来管理多态性的Java代码。 以下是可用的Java代码: 以下是我认为等效的Kotlin代码: 但我在三行“JsonSubTypes.Type”中的每一行都会出现以下错误: 知道吗?

  • 我知道删除或修改注释可以做到这一点,但在这种情况下这不是一个选项。 -将关闭所有注释。这确实删除了冒犯字段,但也扼杀了我想工作的其他注释。