【发布时间】:2016-03-15 13:46:51
【问题描述】:
杰克逊正在做一些真正奇怪的事情,我找不到任何解释。我正在做多态序列化,当一个对象独立时它可以完美地工作。但是,如果您将相同的对象放入一个列表并序列化该列表,它会删除类型信息。
它丢失类型信息的事实会导致人们怀疑类型擦除。但这是在列表的 contents 序列化期间发生的; Jackson 所要做的就是检查它正在序列化的当前对象以确定其类型。
我使用 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")})
public interface 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 不会添加类型信息。有谁知道为什么会这样?
【问题讨论】:
标签: java json serialization jackson