Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 序列化时Jackson不包括字段的类型信息_Java_Json_Jackson_Fasterxml - Fatal编程技术网

Java 序列化时Jackson不包括字段的类型信息

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 { }

我正在尝试使用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 {

}

@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”。有什么建议吗?