2014-10-16 221 views
1

,我期待從JSON反序列化實體如下:傑克遜:反序列化包含列表的泛型類型

public class TypedMemberDTO<T> { 

     private List<T> details; 
     private String type; 

     // Getters and setters 
    } 

我知道T可能因type兩個實際的類中的一個僅屬性的值。

我已經看到了如何使用objectMapper.readValue(json, objectMapper.getTypeFactory().collectionType(ArrayList.class, MyClass.class));

但是反序列化列表的例子,我還沒有看到關於如何實現我要找上面做任何的例子。

有人可以指出我正確的方向反序列化我的課程嗎?

理想我想避免任何基於註解的方法,如果這是可能的

+0

我不認爲這是可能的(由於類型擦除) – 2014-10-16 17:25:45

回答

3

由於@fge在他的評論所說,你可以使用自定義解串器來實現這一目標。

假設type包含列表中的元素的完全限定類名,下面的解串器將做的工作:

 ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.registerModule(new SimpleModule().addDeserializer(TypedMemberDTO.class, 
       new TypedMemberDTODeserializer())); 
     TypedMemberDTO<?> typedMemberDTO = objectMapper.readValue(jsonString, TypedMemberDTO.class); 

public class TypedMemberDTODeserializer extends JsonDeserializer<TypedMemberDTO<?>> { 

    @Override 
    public TypedMemberDTO<?> deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException { 
     try { 
      JsonNode rootNode = jp.getCodec().readTree(jp); 
      String type = rootNode.get("type").asText(); 
      JavaType parametricListType = ctxt.getTypeFactory().constructParametricType(
        List.class, Class.forName(type)); 
      JsonNode detailsNode = rootNode.get("details"); 
      List<?> detailsList = new ObjectMapper().readValue(detailsNode.toString(), parametricListType); 
      return new TypedMemberDTO(detailsList, type); // unchecked 
     } catch (ClassNotFoundException e) { 
      throw new IOException(e); 
     } 

    } 
} 

ObjectMapper需要約解串器通知

我不知道這個解決方案的性能(它在解串器中使用嵌入的ObjectMapper),您可能需要檢查一下。你可以閱讀更多關於定製解串器here