注意点:反序列化实习类要有no-args默认构造函数,如果没有,则Jackson将无法实例化它
第一种方式:静态指定参数
public class Main {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
List<User> asList = mapper.readValue(json, new TypeReference<List<User>>() {
});
Map<String, User> asMap = mapper.readValue("json", new TypeReference<Map<String, User>>() {
});
}
}
第二种方式:动态指定参数
使用TypeFactory动态构建实例
public class Main {
private static ObjectMapper mapper = new ObjectMapper();
public static void main(String[] args) throws IOException {
/**
* List
*/
CollectionType collectionType = constructCollectionType(List.class, User.class);
JavaType javaType = constructParametricType(List.class, User.class);
List<User> asList = mapper.readValue("json", collectionType/javaType);
/**
* Map
*/
JavaType javaType = constructParametricType(HashMap.class, String.class, User.class);
MapType mapType = constructMapType(HashMap.class, String.class, User.class);
Map<String, User> asMap = mapper.readValue("json", mapType/javaType);
}
public static JavaType constructParametricType(Class<?> parametrized, Class<?>... parameterClasses) {
return mapper.getTypeFactory().constructParametricType(parametrized, parameterClasses);
}
public static CollectionType constructCollectionType(Class<? extends Collection> parametrized, Class<?> parameterClasses) {
return mapper.getTypeFactory().constructCollectionType(parametrized, parameterClasses);
}
public static MapType constructMapType(Class<? extends Map> mapClass, Class<?> keyClass, Class<?> valueClass) {
return mapper.getTypeFactory().constructMapType(mapClass, keyClass, valueClass);
}
}