如何将Jackson的TypeReference与泛型一起使用?

Mar*_*hov 6 java generics mapping json jackson

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

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

UserDto看起来像这样:

@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDto {

    @JsonProperty("items")
    private List<User> userList;

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想改进这种映射方法,而不必附加到UserDto类,而是将其替换为通用类。

可能吗?如何?

谢谢。

Sta*_*Man 8

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

我认为您需要的是JavaType:您可以使用TypeFactory. 你得到一个TypeFactoryvia的实例ObjectMapper.getTypeFactory()。您还可以JavaType从 simpleClassTypeReference.


小智 5

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

<T> class XX { XX(Class<T> clazz, ...) ... } 
Run Code Online (Sandbox Code Playgroud)

在构造时将泛型参数的类传递给泛型类。

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

JavaType itemType = mapper.getTypeFactory().constructCollectionType(List.class, clazz);
Run Code Online (Sandbox Code Playgroud)

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