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

时间:2015-03-24 20:45:17

标签: 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;
    }

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

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());

但它没有奏效。

1 个答案:

答案 0 :(得分:5)

由于你有元素类,你可能想要像这样使用你的映射器TypeFactory

final TypeFactory factory = mapper.getTypeFactory();
final JavaType listOfT = factory.constructCollectionType(List.class, t);

然后使用listOfT作为.readValue()的第二个参数。