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

Jackson@JsonSubTypes的替代品

江光明
2023-03-14

Jackson框架提供了基于注释的方法来在序列化过程中发出类型信息。

我不想在我的超级类(Animal)中使用@JsonSubTypes注释。

相反,我想告诉我的子类,即狗和大象,动物是它们的父母。

有没有任何方法可以在不使用动物类中的注释的情况下做到这一点。

如果是,请提供示例,如果可能的话,也可以这样做。

下面是我试图解决的问题。“test”接收的JSON包含“type”字段,如“dog”或“elephant”。

我想将这两个类注册为“动物”类的子类型,但不想在动物中使用@JsonSubTypes。

任何帮助将不胜感激。提前致谢。

@JsonTypeInfo( use = JsonTypeInfo.Id.NAME,  include = JsonTypeInfo.As.PROPERTY, property = "type")
abstract class Animal(){
      private String sound;
      private String type;

     //getters and setters

}

@JsonTypeName("dog")
Class Dog extends Animal(){
     //some attributes.
     //getters and setters
}

@JsonTypeName("elephant")
Class Elephant extends Animal(){
     //some attributes.
     //getters and setters
}


@Controller
public class MyController {

    //REST service
    @RequestMapping( value = "test")
    public  @ResponseBody String save(@RequestBody  Animal animal){

    System.out.println(animal.getClass());
    return success;

    }
}

共有2个答案

仲君昊
2023-03-14

你可以使用Moonwlker库。

有了它,您可以像这样创建一个ObjectMapper:

ObjectMapper objectMapper = new ObjectMapper();

 MoonwlkerModule module =
   MoonwlkerModule.builder()
     .fromProperty("type").toSubclassesOf(Animal.class)
     .build();

 objectMapper.registerModule(module);

然后使用该映射器进行(反)序列化。Moonwlker网站包含更多详细信息和配置选项。

宣望
2023-03-14

这个答案将有助于实现您想要的,但方式略有不同。创建一个带有必要配置的单独类,并将其注册为动物类的序列化/反序列化配置类,如下所示:

配置类:

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
    @Type(value = Elephant.class, name = "cat"),
    @Type(value = Dog.class, name = "dog") })
abstract class PolymorphicAnimalMixIn {
    //Empty Class
}

要序列化或反序列化:

ObjectMapper mapper = new ObjectMapper();
mapper.getDeserializationConfig().addMixInAnnotations(Animal.class, PolymorphicAnimalMixIn.class);  
mapper.getSerializationConfig().addMixInAnnotations(Animal.class, PolymorphicAnimalMixIn.class);

//Sample class with collections of Animal
class Zoo {  
  public Collection<Animal> animals;  
}

//To deserialize
Animal animal = mapper.readValue("string_payload", Zoo.class);

//To serialize
Animal animal = mapper.writeValueAsString(zoo);

参考信用:示例 5

 类似资料:
  • Jackson中使用的注释是什么? ======================================== ============================================== 我的理解是,它还保留了被序列化的对象的具体类型以及实际数据。 我不清楚的是反序列化过程中的实际优势/收益是什么。 除了java文档之外,没有任何重要的文档。任何人都可以在这里提供帮助或提供

  • 朋友 Jackson框架提供了基于注释的方法来在序列化过程中发出类型信息。 我不想在我的任何类中使用@JsonTypeInfo注释。 上述注释是否有替代方案。 如果是,请举例说明如何做到这一点。

  • 问题内容: 问题 在解决这个问题之后,似乎基于文件或磁盘的实现可能是解决我在此处提到的问题的正确解决方案。精简版: 目前,我已将实施为。 条目以相当固定的速率连续添加到其中。稍后对此进行详细说明。 最终,无论如何,这意味着JVM耗尽了堆空间。 在工作中,(强烈)建议我使用SQLite解决此问题,但是在问了上一个问题之后,我认为数据库不是适合此工作的合适工具。所以- 让我知道这听起来是否疯狂 -我认

  • 问题内容: 这是一个从来没有一个正确答案的问题,我已经在网上搜索了很多次,却找不到解决方案。 它适用于Firefox,Chrome。我的responseText将像Réunion这样返回char,它将显示为奇怪的符号。 我尝试了许多方法,例如编码和解码,在响应文件中设置标头都无效。我没主意了。请帮助某人。 在主文件中,确保设置了内容类型和字符集。 在您的AJAX加载页面中,确保您位于顶部。 问题解

  • 我能够序列化和反序列化类层次结构,其中抽象基类用 但是没有列出子类的子类型,子类本身相对没有注释,在构造函数上只有一个JsonCreator。ObjectMapper是vanilla,我没有使用mixin。 Jackson留档在PolymoricDeseriize和type id上建议(强烈)我需要抽象基类上的注释,或者在混音上使用它,或者我需要将子类型注册到ObjectMapper。并且有很多S

  • 问题内容: 我能够序列化和反序列化一个类层次结构,其中抽象基类用 但是没有列出子类,并且子类本身是相对未注释的,仅在构造函数上具有a 。ObjectMapper是香草的,我没有使用mixin。 Jackson关于PolymorphicDeserialization和“ type id”的 文档建议(强烈)我需要在抽象基类上使用批注,或者在mixin上使用它,或者需要在ObjectMapper中注册