大佬教程收集整理的这篇文章主要介绍了为什么Jackson多态序列化在列表中不起作用?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
发生这种情况的各种原因将在此处和此处进行讨论。我不一定与理由同意,但杰克逊,因为类型擦除,并不 @H_772_3@蝙蝠
知道元素的类型List
(或Collection
或@H_303_5@map)含有。它选择使用一个不解释注释的简单序列化器。
在这些链接中建议使用两个选项:
首先,您可以创建一个实现List<Cat>
,适当实例化并序列化实例的类。
class CatList implements List<Cat> {...}
通用类型参数Cat
不会丢失。杰克逊可以访问并使用它。
其次,您可以实例化ObjectWriter
type 并将其使用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,请注明来意。