2014-04-12 31 views
3

Jackson和类型层次结构中存在以下问题。我正在序列化一个类SubA,它将Base扩展为String, ,然后尝试将其解除压缩。当然在编译时,系统不知道它是 Base还是SubA,所以我期待Base,并且在之后会做一些其他操作,如果它是SubAJackson多态反序列化

Base类的样子:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
@JsonSubTypes({ 
    @Type(value = SubA.class, name = "SubA") 
}) 
public class Base { 
    protected String command; // +get +set 
    protected String type; // +get +set 
} 

...和类从Base派生:

@JsonTypeName("SubA") 
public class SubA extends Base { 
    private AnotherClass anotherClass; // +get +set 
    private String test; // +get +set 
    @JsonIgnore 
    @Override 
    public String getType() { 
    return "SubA"; 
    } 
} 

...,我想执行以下代码:

ObjectMapper mapper = new ObjectMapper(); 
ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter(); 
Base payload = new SubA(); // + setting anotherClass as well as test variables 
String requestStringSend = ow.writeValueAsString(payload); 
System.out.println("Sending: " + requestStringSend); 
Base received = mapper.readValue(requestStringSend, Base.class); 
String requestStringReceived = ow.writeValueAsString(received); 
System.out.println("Received: " + requestStringReceived); 

字符串requestStringSend是:

Sending: { 
    "command" : "myCommand", 
    "type" : "SubA", 
    "anotherClass" : { 
    "data" : "someData" 
    }, 
    "test" : "test123" 
} 

但是我不断得到同样的错误。映射器现在知道如何处理anotherClass参数 - 它不存在于Base中。但我想映射器会将它转换成SubA类?

Exception in thread "main" org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "anotherClass" (Class com.test.Base), not marked as ignorable 
    at [Source: [email protected]; line: 4, column: 21] (through reference chain: com.test.Base["anotherClass"]) 
    at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53) 
    at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267) 
    at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:649) 
    at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:635) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:1355) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:717) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) 
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2723) 
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1854) 
    at com.test.Foo.main(Foo.java:32) 

我看看下面的问题/资源:

+0

您正在使用哪个版本的Jackson?我检查了你的例子'杰克逊'2.3.2(com.fasterxml.jackson),一切正常。 –

回答

3

你的代码查找用例是正确的。一个可能的问题是,你可能会意外地使用杰克逊2注释与杰克逊1 ObjectMapper(我可以看到后者是杰克逊从例外包名称)。注释和映射器的版本必须匹配;否则注释将被忽略,这将解释您所看到的问题。

+1

谢谢,这是解决方案!我使用了2.x注释,但使用了1.x ObjectMapper! – Manuel