java - 不使用注释的 Jackson 多态反序列化

标签 java json serialization jackson json-deserialization

我有一个 Animal 类接受泛型类型参数 T,如下所示:

public class Animal<T> {
    private String type;
    private T details;

    // getters and setters
}

类型参数可以是DogCat

public class Dog {
    private String name;
    private boolean goodBoy;

    // no-arg, all-args constructors, getters and setters
}

public class Cat {
    private String name;
    private boolean naughty;

    // no-arg, all-args constructors, getters and setters
}

我正在尝试反序列化以下 JSON

{
    "type": "dog",
    "details": {
        "name": "Marley",
        "goodBoy": true
    }
}

但是,当我反序列化时,字段详细信息总是被反序列化为 LinkedHashMap 而不是类的特定实现。

public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();

    Animal<Dog> dog = new Animal<>();
    dog.setType("dog");
    dog.setDetails(new Dog("Marley", true));

    String dogJson = mapper.writeValueAsString(dog);
    Animal dogDeserialized = mapper.readValue(dogJson, Animal.class);

    // dogDeserialized's details is LinkedHashMap
}

我无法更改上述类,因此无法在该字段上使用注释。有没有一种方法可以指定 ObjectMapper 可以将 details 字段反序列化为的类列表?

请注意,对于相应的 DogCat 类,type 字段的值设置为“dog”或“cat”。

最佳答案

使用TypeReference指定要反序列化的类型

Animal<Dog> dogDeserialized = mapper.readValue(
    dogJson, new TypeReference<Animal<Dog>>() {});

或者代替 DogCat 你可以只有一个具有所有属性的类

public class AnimalDetails {

  private String name;
  private Boolean goodBoy;
  private Boolean naughty;

 }

并设置 ObjectMapper 以忽略 JSON 中的未知属性:

 ObjectMapper mapper = new ObjectMapper()
  .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

所以如果它是 Dog class naughty 将是 null 如果它是 Cat class goodBoy 将为 null

关于java - 不使用注释的 Jackson 多态反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57078055/

相关文章:

java - 在 XMLConfiguration 文件中记录更改

java - 使用递归方法通过控制流中断 Java 循环的迭代

java - 使用 Jackson 的 JSON 数据特殊字段

ruby-on-rails - 使用 Ruby Controller 读取 Instagram JSON 并使用 HTTParty gem 传递到 View

PHP : To serialize or not

c++ - 如何将哈希表存储在文件中?

JsonSerializer 结构与 asp-net 核心 3.0

java - 在没有事件的情况下获取鼠标左键状态

java - Swing组件占用大量内存

jquery - 在 jQuery 中从 JSON 值创建字符串