程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么Jackson多态序列化在列表中不起作用?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决为什么Jackson多态序列化在列表中不起作用??

开发过程中遇到为什么Jackson多态序列化在列表中不起作用?的问题如何解决?下面主要结合日常开发的经验,给出你关于为什么Jackson多态序列化在列表中不起作用?的解决方法建议,希望对你解决为什么Jackson多态序列化在列表中不起作用?有所启发或帮助;

发生这种情况的各种原因将在此处和此处进行讨论。我不一定与理由同意,但杰克逊,因为类型擦除,并不 @H_772_3@蝙蝠 知道元素的类型List(或Collection或@H_303_5@map)含有。它选择使用一个不解释注释的简单序列化器。

在这些链接中建议使用两个选项:

首先,您可以创建一个实现List<Cat>,适当实例化并序列化实例的类。

class CatList implements List<Cat> {...}

通用类型参数Cat不会丢失。杰克逊可以访问并使用它。

其次,您可以实例化ObjectWritertype 并将其使用List<Cat>。例如

System.out.println(new ObjectMapper().writerFor(new TypeReference<List<Cat>>() {}).writeValueAsString(List));

将打印

[{"@type":"cat","name":"heyo"}]

解决方法

杰克逊(Jackson)做的事情确实很奇怪,我找不到任何解释。我正在执行多态序列化,当对象独立时它可以完美地工作。但是,如果将同一个对象放入列表中并对其进行序列化,则会删除类型信息。

它丢失类型信息的事实将导致人们怀疑类型擦除。但这是在列表 @H_772_3@内容 的序列化过程中发生的。Jackson要做的只是检查要序列化的当前对象以确定其类型。

我使用杰克逊2.5.1创建了一个示例:

import com.fasterxml.jackson.Annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.Annotation.JsonSubTypes;
import com.fasterxml.jackson.Annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.Annotation.JsonTypeInfo;
import com.fasterxml.jackson.Annotation.JsonTypename;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.objectMapper;

import java.util.ArrayList;
import java.util.List;

public class Test {

  @JsonIgnoreProperties(ignoreUnknown = truE)
  @JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY)
  @JsonSubTypes({
    @Type(value = Dog.class,name = "dog"),@Type(value = Cat.class,name = "cat")})
  publi@R_673_8592@erface Animal {}

  @JsonTypename("dog")
  public static class Dog implements Animal {
    private String name;

    public String getName() {
      return name;
    }

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

  @JsonTypename("cat")
  public static class Cat implements Animal {
    private String name;

    public String getName() {
      return name;
    }

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

  public static void main(String[] args) throws JsonProcessingException {
    List<Cat> list = new ArrayList<>();
    list.add(new Cat());
    System.out.println(new ObjectMapper().writeValueAsString(list));
    System.out.println(new ObjectMapper().writeValueAsString(list.get(0)));
  }
}

这是输出:

[{"name":null}]
{"@type":"cat","name":null}

如您所见,当对象在列表中时,Jackson不会添加类型信息。有人知道为什么会这样吗?

大佬总结

以上是大佬教程为你收集整理的为什么Jackson多态序列化在列表中不起作用?全部内容,希望文章能够帮你解决为什么Jackson多态序列化在列表中不起作用?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。