2016-10-17 203 views
3

我想为需要JSON输入的前端库创建一个java SDK。实质上,该SDK将某些类型的对象转换为JSON,然后由该前端库使用。使用杰克逊反序列化时丢失的字段(多态)

我使用杰克逊的多态序列化/反序列化使用其注释系统。

我有一个基类A和2个子类B和C扩展A.类A有一个类型字段,使用它我决定使用哪个类(B或C)。语法看起来是这样的:

@JsonTypeInfo({ 
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.EXISTING_PROPERTY, 
    property= "type" 
}) 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = B.class, name = "b"), 
    @JsonSubTypes.Type(value = C.class, name = "c") 
}) 
public class A { 
    private String type; 

    public void setType(String type){ 
    this.type = type; 
    } 

    public String getType(){ 
    return this.type; 
    } 
} 

public class B extends A { 

} 

public class C extends A { 

} 

所以现在,当我使用杰克逊的ObjectMapperreadValue功能和阅读字符串化JSON,并转换为A类,我得到基于无论是A类或B类的正确实例关于类型变量的值。 然而,这里是实际的问题,当我尝试使用功能getType我总是在这些对象获得null。我不知道为什么杰克逊没有在对象上设置这些值。

String json = "{ type: 'b' }"; // example input json 

ObjectMapper om = new ObjectMapper(); 
A a = om.readValue(json, A.class); 
// a is actually an instance of class B 

a.getType()// this is null 

回答

2

您需要添加到@JsonTypeInfo参数visible = true避免反序列化时卸下的类型。

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.EXISTING_PROPERTY, 
    property= "type", 
    visible = true 
) 

公共抽象布尔可见()默认假

属性定义是否类型标识符值将作为串并转换器(真)JSON流的一部分来传递,或处理和由TypeDeserializer除去 (假)。属性对 序列化没有影响。默认值为false,这意味着Jackson处理 并从JSON内容中移除类型标识符,JSONDeserializer传递给 。

+0

谢谢,工作!不知道我在文档中错过了它。 – Rajan