在杰克逊序列化时保留类型信息,并相应地反序列化

时间:2019-06-17 21:21:48

标签: java jackson

在一个用例中,我有一个类A的对象说a,一个类B的对象说b,b实习生有一个类C的子类的成员变量说c。 我的用例是我要对a进行序列化/反序列化,以便在序列化时向成员c添加一个类型变量,利用该变量可以识别对象所属的子类。我正在尝试通过杰克逊实现这一目标。请参考下面的代码:

Class A{
B b;
}

Class B{
C c;
}

Class C {
}

Class D extends C{
int a;
}

Class E extends C{
string b;
}

当我有C c =新的D(),B b =新的B(c),A =新的A(b)时期望:

"A":{
    "B":{
        "type":D
        "C":c
    }
}

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

感谢所有我能够使用@ son-JizenInfo的答案,使用JsonTypeInfo和JsonSubTypes。 这是我使用的注释:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = D.class, name = "D"),
               @JsonSubTypes.Type(value = E.class, name = "E")})

因为由于所有权原因我无法编辑类C,所以将它与mixIn类一起使用。这是我的创建方式:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = D.class, name = "D"),
               @JsonSubTypes.Type(value = E.class, name = "E")})
abstract class CMixIn {

}

这是我使用mixIn类的方式:

private ObjectMapper objectMapper = new ObjectMapper().addMixIn(C.class, CMixIn.class);

现在要序列化类A的对象a:

String serializedString = objectMapper.writeValueAsString(a);

要反序列化上面的字符串:

objectMapper.readValue(serializedString, A.class);