Java 如何使用Jackson';是泛型的TypeReference吗?
对于json映射,我使用以下方法:Java 如何使用Jackson';是泛型的TypeReference吗?,java,json,generics,jackson,mapping,Java,Json,Generics,Jackson,Mapping,对于json映射,我使用以下方法: public static <T> T mapJsonToObject(String json, T dtoClass) throws Exception { ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(json, new TypeReference<RestResponse<UserDto>>() { }); }
public static <T> T mapJsonToObject(String json, T dtoClass) throws Exception {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(json, new TypeReference<RestResponse<UserDto>>() {
});
}
publicstatictmapjsontoobject(stringjson,tdtoclass)抛出异常{
ObjectMapper mapper=新的ObjectMapper();
返回mapper.readValue(json,newTypeReference(){
});
}
而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;
}
}
@JsonIgnoreProperties(ignoreUnknown=true)
公共类UserDto{
@JsonProperty(“项目”)
私有列表用户列表;
公共列表getUserList(){
返回用户列表;
}
public void setUserList(List userList){
this.userList=userList;
}
}
我想改进这种映射方法,而不必附加到UserDto类,并用泛型替换它
可能吗?怎么做
谢谢。
TypeReference
要求您静态地指定参数,而不是动态地指定参数,因此如果您需要进一步参数化类型,它将不起作用
我认为您需要的是
JavaType
:您可以使用TypeFactory
动态构建实例。您可以通过ObjectMapper.getTypeFactory()
获得TypeFactory
的实例。您还可以从simpleClass
以及TypeReference构建JavaType
实例,其中一种方法是定义JacksonJavaType,表示clazz类型的项列表。您仍然需要在运行时访问泛型参数的类。通常的方法是
<T> class XX { XX(Class<T> clazz, ...) ... }
我希望这有帮助。我在自己的代码中使用了这种方法。@Dici我想将一个泛型类作为参数传递给该方法,并调用TypeReference,如下所示:new TypeReference()
您的问题与Jackson差不多,除了Gson之外。答案是一样的,您只需要调整库API。是的,这是。简而言之:类型擦除使得在Java中不可能做到这一点。但是我发现你可以在科特林。另见:
JavaType itemType = mapper.getTypeFactory().constructCollectionType(List.class, clazz);