Java 序列化时Jackson不包括字段的类型信息
我正在尝试使用jackson 2.6.3将一个对象序列化为json 我想在序列化的json中包含类型信息。这不适用于嵌套在此类中的成员 这是测试代码Java 序列化时Jackson不包括字段的类型信息,java,json,jackson,fasterxml,Java,Json,Jackson,Fasterxml,我正在尝试使用jackson 2.6.3将一个对象序列化为json 我想在序列化的json中包含类型信息。这不适用于嵌套在此类中的成员 这是测试代码 public class Test { @JsonSubTypes({ @JsonSubTypes.Type(value = ConcreteA.class)}) interface A { } @JsonTypeInfo( use=JsonTypeInfo.Id.CLASS) class ConcreteA implements A { }
public class Test {
@JsonSubTypes({ @JsonSubTypes.Type(value = ConcreteA.class)})
interface A {
}
@JsonTypeInfo( use=JsonTypeInfo.Id.CLASS)
class ConcreteA implements A {
}
@JsonSubTypes({ @JsonSubTypes.Type(value = ConcreteB.class)})
interface B {
}
@JsonTypeInfo( use=JsonTypeInfo.Id.CLASS)
class ConcreteB implements B {
A a;
public A getA() {
return a=new ConcreteA();
}
}
@org.junit.Test
public void testSerialisation() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
System.out.println(objectMapper.writeValueAsString(new ConcreteB()));
}
}
jackson正在转换的json是
{"@class":"Test$ConcreteB","a":{}}
请注意,它不包括字段“a”的类型信息。仅序列化一个文件时,会包含类型信息
{"@class":"Test$ConcreteA"}
更新:
以下是jackson dev对该问题的解释和解决方案
看起来您已经非常接近了,您需要添加的只是告诉jackson如何处理您的接口类型
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "@class")
@JsonSubTypes({
@JsonSubTypes.Type(value = ConcreteA.class)})
interface A {
}
因此,将@JsonTypeInfo
添加到界面将在属性中添加类型信息,您可以将该属性配置为您期望的属性,在本例中,我选择了@class
我从示例中获得的Json输出:
{“@class”:“com.company.jackson.Test$ConcreteB”,“a”:{“@type”:“Test$ConcreteA”}
希望有帮助
JoséLuis看起来你已经非常接近了,你需要添加的只是告诉jackson如何处理你的接口类型
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "@class")
@JsonSubTypes({
@JsonSubTypes.Type(value = ConcreteA.class)})
interface A {
}
因此,将@JsonTypeInfo
添加到界面将在属性中添加类型信息,您可以将该属性配置为您期望的属性,在本例中,我选择了@class
我从示例中获得的Json输出:
{“@class”:“com.company.jackson.Test$ConcreteB”,“a”:{“@type”:“Test$ConcreteA”}
希望有帮助
何塞·路易斯我也面临同样的问题。 我导入了错误的ObjectMapper类 理想情况下,它应该是jackson-databind.jar
com.fasterxml.jackson.databind.ObjectMapper
org.codehaus.jackson.map.ObjectMapper
但是我已经导入了jackson mapper asl.jar
com.fasterxml.jackson.databind.ObjectMapper
org.codehaus.jackson.map.ObjectMapper
我也面临同样的问题。 我导入了错误的ObjectMapper类 理想情况下,它应该是jackson-databind.jar
com.fasterxml.jackson.databind.ObjectMapper
org.codehaus.jackson.map.ObjectMapper
但是我已经导入了jackson mapper asl.jar
com.fasterxml.jackson.databind.ObjectMapper
org.codehaus.jackson.map.ObjectMapper
为什么序列化B时需要“a”的类型信息?当您反序列化到“B”时,“a”的类型将由B给出。a是一个接口,可以有许多实现。在没有类型信息的情况下,您如何知道要反序列化哪种类型?我现在看到了这个问题,它也正常工作了。为什么在序列化B时需要“a”的类型信息?当您反序列化到“B”时,“a”的类型将由B给出。a是一个接口,可以有许多实现。在没有类型信息的情况下,您如何知道要反序列化哪种类型?我现在看到了这个问题,也解决了它。只需将@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS)添加到。谢谢你的指点。很高兴听到它起作用并帮助了你,你能接受答案吗?谢谢我希望在“@class”中有完全限定的类名。上述解决方案将类型名称置于“@class”中。使用JsonTypeInfo.Id.CLASS将接口的类名而不是实现。当我们在数组中应用它时,Jackson不会对生成的JSON应用“@CLASS”。有什么建议吗?只需将@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS)添加到works中即可。谢谢你的指点。很高兴听到它起作用并帮助了你,你能接受答案吗?谢谢我希望在“@class”中有完全限定的类名。上述解决方案将类型名称置于“@class”中。使用JsonTypeInfo.Id.CLASS将接口的类名而不是实现。当我们在数组中应用它时,Jackson不会对生成的JSON应用“@CLASS”。有什么建议吗?