2016-12-01 66 views
1

通过以下方式实现了一个自定义解串器来反序列化JSON。但是mapper.treeToValue导致无限次地调用代码。Json自定义解串器陷入无限递归

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方法和执行它无限的次数和造成的StackOverflowError。

有什么建议吗?

回答

2

我们面临着类似的情况,这种解决方案是基于: 定制解串用于解析JSON多态,而无需使用类型属性

允许调用多态类如BaseResource(基类),SubResource1 ,SubResource2。

BaseResource有注释使用JsonDeserialer.None.class

@JsonDeserialze(using=JsonDeserialer.None.class) 
public class SubResource1 extends BaseResource{ 
...... 
} 

参考来指定哪些CustomSerializer类

@JsonDeserialze(using=CustomDeserializer.class) 
public class BaseResource{ 
...... 
} 

于是就SubResource1和SubResource2,我们添加注释不使用CustomDeserialzer.class :http://www.robinhowlett.com/blog/2015/03/19/custom-jackson-polymorphic-deserialization-without-type-metadata/