Java 抽象类和它的StdDeserializer';亚型
假设有一个抽象类A,它有一个属性A和三个非抽象子类B、C和D。B没有额外的属性,C包含属性C,D同时包含属性C和D 我想为抽象类A创建一个子类,以便能够根据要反序列化的属性的存在来决定选择哪个子类 我以前在Codehaus的一些Jackson版本中这样做过,使用以下实现工作正常:Java 抽象类和它的StdDeserializer';亚型,java,json,jackson,Java,Json,Jackson,假设有一个抽象类A,它有一个属性A和三个非抽象子类B、C和D。B没有额外的属性,C包含属性C,D同时包含属性C和D 我想为抽象类A创建一个子类,以便能够根据要反序列化的属性的存在来决定选择哪个子类 我以前在Codehaus的一些Jackson版本中这样做过,使用以下实现工作正常: class AbstractADeserializer extends StdDeserializer<A> { AbstractADeserializer () { super(A
class AbstractADeserializer extends StdDeserializer<A> {
AbstractADeserializer () {
super(A.class);
}
@Override
public A deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = (ObjectNode) mapper.readTree(jp);
Class<? extends A> requestClass = null;
// root.getFieldNames() is an iterator over all field names
JsonNode cValue = root.findValue("c");
JsonNode dValue = root.findValue("d");
/*
* Check for existence of required fields and choose the
* corresponding request class.
*/
logger.debug(Boolean.toString(c != null));
logger.debug(Boolean.toString(d != null));
if(c != null && d == null) {
logger.debug("Found C");
requestClass = C.class;
} else if(c != null && d != null) {
logger.debug("Found D");
requestClass = D.class;
} else {
logger.debug("Found B");
requestClass = B.class;
}
return mapper.readValue(root, requestClass);
}
}
您认为有哪些替代方案可以在不需要手动反序列化对象的情况下灵活地确定给定输入的类?对我来说,克隆JsonParser以避免耗尽它的输入源看起来很复杂。刚刚遇到了类似的问题,而对我来说,用
mapper.readValue(jp,requestClass)
替换mapper.treeToValue(root,requestClass)
来吧:Hello@RobbyCornelissen。谢谢你给我指出这一页。我知道这一点,不想包含类型信息属性。我不能自己反序列化对象的另一个原因是,在一个非抽象类中有一个更复杂的嵌套对象。因此,手动反序列化将非常混乱,最好委托给Jackson。我试图对类层次结构做同样的事情(让反序列化器根据字段选择正确的子类),但这种方法在codehaus 1.9或fasterxml 2.4.1中不适用。我一直得到stackoverflow异常,因为readValue/treeToValue调用了反序列化程序。解决方法是使用上面的技术和反序列化修改器-.Update:结果我不得不将@JsonDeserialize(using=JsonDeserializer.None.class)添加到派生类中。这巧妙地避免了递归,一旦我这样做了,我就可以使用上面问题中概述的技术。非常感谢您的回答!糟糕的是,我自己没有看到这个方法,但我想我只是在大量的方法中忽略了它:)
com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: org.apache.catalina.connector.CoyoteInputStream@1286ec89; line: 1, column: 559]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3095)
at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3009)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1637)