从http://wiki.fasterxml.com/JacksonInFiveMinutes(也看在杰克逊TypeFactory 1.3+):
数据与泛型
绑定除了结合POJO和“简单”类型,还有一个额外的变体:绑定到通用(键入)的容器。这种情况需要特殊的处理,因为所谓的Type Erasure(被Java用来以某种向后兼容的方式实现泛型),这会阻止你使用像Collection.class(它不会编译)的东西。
所以,如果你想将数据绑定到一个地图,你将需要使用:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
这里只需要TypeReference传递泛型类型定义(通过anynomous内部类在这种情况下):重要组成部分是>它定义要绑定的类型。
如果您不这样做(并且仅传递Map.class),则调用相当于绑定到Map(即“无类型”Map),如上所述。
如果你的意思是多态的反序列化,检查此链接http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html其中讨论了使用杰克逊的注释,以协助映射器选择合适的对象作业。
我写这篇今天(我敢肯定,这可以改善),用于简单地把一个JSON字符串,并始终将其转化成的DTO(或是别的什么可以转换成)的列表。这可以用任何类型调用,并且可以修改为返回单个实例或List,或者您希望的任何内容。 OBJECT_MAPPER是一个静态的ObjectMapper变量。
public static <T> List<T> getFromJSONCollection(String jsonString, final Class<T> type) throws IOException {
try {
return OBJECT_MAPPER.readValue(jsonString, TypeFactory.defaultInstance().constructCollectionType(ArrayList.class, type));
} catch (JsonMappingException e) {
return getFromJSON(jsonString, type);
}
}
public static <T> List<T> getFromJSON(final String jsonString, final Class<T> type) throws IOException {
return new ArrayList<T>() {{ add(OBJECT_MAPPER.readValue(jsonString, type));}};
}
感谢Larry的回应。对不起,2年后回复..哈哈哈 – PrabhakaranR 2014-10-22 13:32:58