通过以下方式实现自定义反序列化器以反序列化JSON.但mapper.treeToValue导致无限次调用代码.
public class MyDeserializer extends StdDeserializer {
@Override
public myResourcedeserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
MyResource resource = null;
Class extends MyResource > clazz = null;
ObjectMapper mapper = (ObjectMapper) parser.getCodec();
ObjectNode node = (ObjectNode) mapper.readTree(parser);
Iterator> elementsIterator = node.fields();
while (elementsIterator.hasNext()) {
Map.Entry element = elementsIterator.next();
if(element.getKey().equals("typeId"))
{
if(element.getValue().asInt() == 1)
{
clazz = SpecificResource.class;
break;
}
}
}
return mapper.treeToValue(node,clazz);
}
执行mapper.treeToValue后,控制再次返回myResourcedeserialize方法并执行无限次数并导致stackOverFlowError.
有什么建议吗?
解决方法:
我们遇到过类似的情况,这个解决方案基于:
自定义反序列化器用于在不使用type属性的情况下以多态方式解析JSON
让我们将多态类称为BaseResource(基类),SubResource1,SubResource2.
BaseResource具有注释以指定哪个CustomSerializer类
@JsonDeserialze(using=CustomDeserializer.class)
public class BaseResource{
......
}
所以在SubResource1和SubResource2上,我们通过使用JsonDeserialer.None.class添加注释以不使用CustomDeserialzer.class
@JsonDeserialze(using=JsonDeserialer.None.class)
public class SubResource1 extends BaseResource{
......
}
标签:java,json,jackson,deserialization
来源: https://codeday.me/bug/20190828/1754925.html