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类,而是将其替换为通用类。
可能吗?如何?
谢谢。
TypeReference
要求您静态地而不是动态地指定参数,因此如果您需要进一步参数化类型,它不起作用。
我认为您需要的是JavaType
:您可以使用TypeFactory
. 你得到一个TypeFactory
via的实例ObjectMapper.getTypeFactory()
。您还可以JavaType
从 simpleClass
和TypeReference
.
小智 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)
我希望它有帮助。我在自己的代码中使用这种方法。