Jackson 通用 json 到 List<T> 转换器方法不起作用
Jackson generic json to List<T> converter method does not work
public static <T> List<T> convertJSONStringTOListOfT(String jsonString, Class<T> t){
if(jsonString == null){
return null;
}
ObjectMapper mapper = new ObjectMapper();
try
{
List<T> list = mapper.readValue(jsonString, new TypeReference<List<T>>() {});
return list;
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
我有上面的方法,当我尝试使用以下方法调用它时:
list = convertJSONStringTOListOfT(str, CustomAssessmentQuestionSetItem.class);
返回的列表是List<LinkedHashMap>
而不是List<CustomAssessmentQuestionSetItem>
尽管如果我不使用泛型,那么下面的代码可以正常工作:
list = mapper.readValue(str, new TypeReference<List<CustomAssessmentQuestionSetItem>>() {});
这两个调用在我看来是一样的。无法理解为什么通用的要创建 List<LinkedHashMap>
而不是 List<CustomAssessmentQuestionSetItem>
仅供参考:我也尝试将方法签名更改为
public static <T> List<T> convertJSONStringTOListOfT(String jsonString, T t)
以及对
的相应调用
list = convertJSONStringTOListOfT(str,new CustomAssessmentQuestionSetItem());
但是没用。
因为你有元素 class 你可能想像这样使用你的映射器的 TypeFactory
:
final TypeFactory factory = mapper.getTypeFactory();
final JavaType listOfT = factory.constructCollectionType(List.class, t);
然后使用 listOfT
作为 .readValue()
的第二个参数。
public static <T> List<T> convertJSONStringTOListOfT(String jsonString, Class<T> t){
if(jsonString == null){
return null;
}
ObjectMapper mapper = new ObjectMapper();
try
{
List<T> list = mapper.readValue(jsonString, new TypeReference<List<T>>() {});
return list;
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
我有上面的方法,当我尝试使用以下方法调用它时:
list = convertJSONStringTOListOfT(str, CustomAssessmentQuestionSetItem.class);
返回的列表是List<LinkedHashMap>
而不是List<CustomAssessmentQuestionSetItem>
尽管如果我不使用泛型,那么下面的代码可以正常工作:
list = mapper.readValue(str, new TypeReference<List<CustomAssessmentQuestionSetItem>>() {});
这两个调用在我看来是一样的。无法理解为什么通用的要创建 List<LinkedHashMap>
而不是 List<CustomAssessmentQuestionSetItem>
仅供参考:我也尝试将方法签名更改为
public static <T> List<T> convertJSONStringTOListOfT(String jsonString, T t)
以及对
的相应调用list = convertJSONStringTOListOfT(str,new CustomAssessmentQuestionSetItem());
但是没用。
因为你有元素 class 你可能想像这样使用你的映射器的 TypeFactory
:
final TypeFactory factory = mapper.getTypeFactory();
final JavaType listOfT = factory.constructCollectionType(List.class, t);
然后使用 listOfT
作为 .readValue()
的第二个参数。