我想尝试使用Jackson转换器选项来解析一些自定义字符串。我必须处理遗留字符串表示,这些字符串表示有自己的解析器能够获取字符串并将其转换为我想要的类IceComTerm
。所以我创建了一个使用IceComTerm
类型字段的类(为了便于阅读而删除了一些额外的字段)和一个转换器
public final class PropertySetRepresentation {
@JsonProperty("kbPrepare")
@JsonDeserialize(converter = IceComTermJsonAdapter.IceComTermDeserializationConverter.class)
private final IceComTerm kbPrepare;
@JsonCreator
public PropertySetRepresentation(@JsonProperty("kbPrepare")IceComTerm kbPrepare){
this.kbPrepare = kbPrepare;
}
@JsonIgnore
public IceComTerm getIceComRepresentation() {
return kbPrepare;
}
}
public class IceComTermJsonAdapter {
public static class IceComTermDeserializationConverter extends StdConverter<String, IceComTerm> {
@Override
public IceComTerm convert(String arg) {
try {
return IceComFactory.parseIceTerm(arg);
} catch (IceComException e) {
e.printStackTrace();
throw new IllegalArgumentException("Incorrect IceComString, fails to parse as IceCom: " + e.getMessage(), e);
}
}
}
}
我希望它能够获取一个字符串并将其转换为我需要的IceComTerm
类型。但是当我运行以下测试时,我得到一个例外:
@Test
public void deserializePropertySetRepresentation() throws IOException {
String propertySet = "{\"kbPrepare\":\"[forall,?circ,in,[:set,Circuit-36]]\"}";
PropertySetRepresentation model = JSON_MAPPER.readValue(propertySet, PropertySetRepresentation.class);
assertNotNull(model);
}
com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of iceInterfaces.IceComTerm, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information
at [Source: {"kbPrepare":"[forall,?circ,in,[:set,Circuit-36]]"}; line: 1, column: 2]
我认为如果我使用转换器,IceComTerm
是抽象类并不重要,因为我通过解析转换器中的字符串来创建特定实例。我在这里缺少什么?我正在使用Jackson 2.5.0
答案 0 :(得分:0)
听起来像是一个可能的错误,可能是构造函数“看不到”来自字段的注释。您可以尝试查看构造函数参数旁边的移动@JsonDeserialize
是否有所不同。
无论哪种方式,值得报告错误:https://github.com/FasterXML/jackson-databind/issues/