【问题标题】:Jackson: deserializing a generic type that contains a listJackson:反序列化包含列表的泛型类型
【发布时间】:2014-10-17 04:18:02
【问题描述】:

我希望从 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)); 反序列化列表的示例

但是,我还没有看到任何关于如何实现上述目标的示例。

有人可以为我指出反序列化我的课程的正确方向吗?

如果可能的话,我希望避免任何基于注释的方法

【问题讨论】:

  • 我认为这是不可能的(由于类型擦除)

标签: java json jackson


【解决方案1】:

正如@fge 在他的评论中建议的那样,您可以使用自定义反序列化器来实现这一点。

假设type 包含列表元素的完全限定类名,以下反序列化器将完成这项工作:

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 objectMapper = new ObjectMapper();
        objectMapper.registerModule(new SimpleModule().addDeserializer(TypedMemberDTO.class,
                new TypedMemberDTODeserializer()));
        TypedMemberDTO<?> typedMemberDTO = objectMapper.readValue(jsonString, TypedMemberDTO.class);

我不知道这个解决方案的性能(它在反序列化器中使用嵌入式ObjectMapper),您可能需要检查一下。您可以阅读更多关于自定义反序列化程序的信息here

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 2012-07-24
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    相关资源
    最近更新 更多