如何在java中为Jackson/ObjectMapper创建通用函数?
所以我有这些方法:
private List<ClientRepresentation> toClientRepresentation(String json) {
try {
return objectMapper.readValue(json, new TypeReference<List<ClientRepresentation>>() {
});
} catch (JsonProcessingException e) {
throw new RuntimeException("Could not parse json.");
}
}
private List<RoleRepresentation> toRoleRepresentation(String json) {
try {
return objectMapper.readValue(json, new TypeReference<List<RoleRepresentation>>() {
});
} catch (JsonProcessingException e) {
throw new RuntimeException("Could not parse json.");
}
}
private List<UserRepresentation> toUserRepresentation(String json) {
try {
return objectMapper.readValue(userJson, new TypeReference<List<UserRepresentation>>() {
});
} catch (JsonProcessingException e) {
throw new RuntimeException("Could not parse json.");
}
}
你可以看到这些是相似的。。。想有一个方法来解决这些。。。大概是这样的:
private List<T> toObjectsList(String json, Class classToConvert) {
try {
return objectMapper.readValue(json, new TypeReference<List<classToConvert>>() {
});
} catch (JsonProcessingException e) {
throw new RuntimeException("Could not parse json.");
}
}
可能吗?怎么做
提前谢谢
# 1 楼答案
首先请注意
Class<?>
只能用于传递无类型参数的构造。因此,像List<String>
这样的东西不能用它来传达(只有“列表”-任何和所有列表,未经参数化-这是类唯一可以传达的东西)。如果你想要toObjectsList
返回类似于List<Map<String, Object>>
的东西,你在这个问题上就死定了:整个设置根本无法做到这一点。所以,首先考虑一下这是不是一个好主意:你在妨碍你自己,你的^ {< CD3}}方法永远无法返回类型化类型的列表。大概,如果您愿意记录这一点,并通过不使用toObjectsList
和编写基于readValue的自定义方法来满足这些需求,那么您就可以开始了假设您已经接受了这个限制,那么问题可以归结为:如何动态地构造STT(超级类型标记,后面有括号的TypeReference对象)
这应该是可行的,使用^{} 类
例如,
constructParametricType(List.class, List.class, classToConvert);
然后,我们需要解决代码中的一些其他错误:
<T>
,但首先需要声明T存在李>Class
本身是参数化的李>这使我们能够:
(你可能必须投到
List<T>
,但我认为由于杰克逊的某些可疑黑客行为,不需要投到List<T>
)