想做 jackson 的string to List方法,于是这样封装:
private static final ObjectMapper JSON =
new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true)
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.registerModule(new JavaTimeModule());
public static <T> List<T> jsonToList(String jsonArray) throws JsonException {
try {
return (List<T>) JSON.readValue(jsonArray, new TypeReference<List<T>>() {
});
} catch (Throwable e) {
log.error("jsonToList error", e);
throw new JsonException(e);
}
}
调用:
public static void main(String[] args) throws Exception {
String test = "[{\"p1\":\"p1\",\"p2\":\"p1\"},{\"p2\":\"p1\"}]";
List<Test> testList = jsonToList(test);
log.info("{}", testList);
log.info("{}", testList.stream().map(p -> p.p1).collect(Collectors.toList()));
}
@Data
class Test {
String p1;
String p2;
}
结果
Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.thizgroup.tsp.dao.util.JsonUtils$Test
用debug模式看了下,testList中实例居然是 LinkedHashMap 而不是 Test类,奇怪,不用方法封装试下
List<Test> testList = JSON.readValue(test, new TypeReference<List<Test>>() {});
没问题了。。。
所以原因就是 TypeReference中的参数不能用泛型参数,必须要实际的
解决方法,使用 fastjson 或者下面:
public static <T> List<T> jsonToList(String jsonArray, Class<T> type) throws JsonException {
if (StringUtils.isEmpty(jsonArray)) {
return new ArrayList<>();
}
try {
return (List<T>) JSON
.readValue(jsonArray, JSON.getTypeFactory().constructParametricType(List.class, type));
} catch (Throwable e) {
log.error("jsonToList error", e);
throw new JsonException(e);
}
}