2016-12-01 8 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

私たちは似たような状況に直面しているし、この溶液を、それに基づいている: カスタムデシリアライザは、ポリモーフィック

はBaseResource(基底クラス)、SubResource1として多型のクラスを呼び出すことができますtype属性を使用せずにJSONを解析するために使用されます、SubResource2。

BaseResourceはJsonDeserialer.None.class

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

リファレンスを使用して

がSubResource1とSubResource2にそう
@JsonDeserialze(using=CustomDeserializer.class) 
public class BaseResource{ 
...... 
} 

、我々はCustomDeserialzer.classを使用しないように注釈を追加したCustomSerializerクラスを指定する注釈を持っています:http://www.robinhowlett.com/blog/2015/03/19/custom-jackson-polymorphic-deserialization-without-type-metadata/

関連する問題