自定义的Json反序列化器陷入无限递归。

7

我们实现了一个自定义反序列化器,通过以下方式反序列化JSON。但是,mapper.treeToValue会导致代码无限次调用。

public class MyDeserializer extends StdDeserializer<MyResource>  {
       @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<Map.Entry<String, JsonNode>> elementsIterator = node.fields();

        while (elementsIterator.hasNext()) {
            Map.Entry<String, JsonNode> 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方法并无限次执行,导致堆栈溢出错误。 有什么建议吗?
1个回答

12
我们曾经面临过类似的情况,这个解决方案基于此: 使用自定义反序列化器来解析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{
......
}

参考资料:http://www.robinhowlett.com/blog/2015/03/19/custom-jackson-polymorphic-deserialization-without-type-metadata/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接