杰克逊通用json到List <T>转换器方法不起作用

cod*_*iot 1 java json jackson fasterxml

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;
    }
Run Code Online (Sandbox Code Playgroud)

我有以上方法,当我尝试使用以下方法调用它时:

list = convertJSONStringTOListOfT(str, CustomAssessmentQuestionSetItem.class);
Run Code Online (Sandbox Code Playgroud)

返回的列表List<LinkedHashMap>不是List<CustomAssessmentQuestionSetItem>

虽然如果我不使用泛型,那么下面的代码工作正常:

list = mapper.readValue(str, new TypeReference<List<CustomAssessmentQuestionSetItem>>() {});
Run Code Online (Sandbox Code Playgroud)

这两个调用对我来说都是一样的.无法理解为什么通用的创建List<LinkedHashMap>而不是List<CustomAssessmentQuestionSetItem>

仅供参考:我也尝试将方法签名更改为

public static <T> List<T> convertJSONStringTOListOfT(String jsonString, T t)
Run Code Online (Sandbox Code Playgroud)

以及相应的调用

list = convertJSONStringTOListOfT(str,new CustomAssessmentQuestionSetItem());
Run Code Online (Sandbox Code Playgroud)

但它没有奏效.

fge*_*fge 5

既然你有元素类,你可能想要使用你的mapper TypeFactory:

final TypeFactory factory = mapper.getTypeFactory();
final JavaType listOfT = factory.constructCollectionType(List.class, t);
Run Code Online (Sandbox Code Playgroud)

然后listOfT用作你的第二个参数.readValue().