如何将杰克逊的TypeReference与泛型一起使用?

时间:2016-01-03 15:54:26

标签: java json generics jackson mapping

对于json映射,我使用以下方法:

ngModel

UserDto 看起来像这样:

public static <T> T mapJsonToObject(String json, T dtoClass) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.readValue(json, new TypeReference<RestResponse<UserDto>>() {
    });
}

我希望改进这种映射方法,而不是附加到 UserDto 类,并将其替换为泛型。

有可能吗?怎么样?

感谢。

3 个答案:

答案 0 :(得分:2)

TypeReference要求您静态指定参数,而不是动态指定参数,因此如果您需要进一步参数化类型,它将无效。

我认为您需要的是JavaType:您可以使用TypeFactory动态构建实例。您通过TypeFactory获得ObjectMapper.getTypeFactory()的实例。您还可以从简单JavaType以及Class构建TypeReference个实例。

答案 1 :(得分:0)

一种方法是定义一个表示 clazz 类型项目列表的Jackson JavaType 。您仍然需要在运行时访问通用参数的类。常用的方法是

<T> class XX { XX(Class<T> clazz, ...) ... } 

将通用参数的类传递给构造时的通用类​​。

在访问Class clazz 变量后,您可以使用以下语句构造一个Jackson JavaType,以表示例如 clazz 类的项目列表。

JavaType itemType = mapper.getTypeFactory().constructCollectionType(List.class, clazz);

我希望能有所帮助。我在自己的代码中使用了这种方法。

答案 2 :(得分:0)

试试这个:

    import com.fasterxml.jackson.databind.ObjectMapper;
    import java.lang.reflect.Array;
    import java.util.Arrays;
    
    ...        


    public static <TargetType> List<TargetType> convertToList(String jsonString, Class<TargetType> targetTypeClass) {
        List<TargetType> listOfTargetObjects = null;
        ObjectMapper objectMapper = new ObjectMapper();
        TargetType[] arrayOfTargetType = (TargetType[]) Array.newInstance(targetTypeClass, 0);

        try {
            listOfTargetObjects = (List<TargetType>) Arrays.asList(objectMapper.readValue(jsonString, arrayOfTargetType.getClass()));
        } catch (JsonMappingException jsonMappingException) {
            listOfTargetObjects = null;
        } catch (JsonProcessingException jsonProcessingException) {
            listOfTargetObjects = null;
        } catch (Exception exception) {
            listOfTargetObjects = null;
        }

        return listOfTargetObjects;
    }
...