我有两种类型的TypeReferences将在杰克逊的readValue方法中传递。
1. Foo<AbstractResponse>
2. Foo <String>
通过这两个引用中的任何一个时,如何使杰克逊readValue正常工作
由于我正在处理Http调用,因此我尝试发送自定义错误代码,并在此基础上更改了readValue方法中传递的Type-reference,该方法有效。但是我正在寻找一个比这更有效的解决方案。
为了使这项工作,我可以使用此:
mapper.readValue(jsonParser, new TypeReference<Foo<AbstractResponse>(){})
或这个
mapper.readValue(jsonParser, new TypeReference<Foo<String>(){})
但这是预期的:
mapper.readValue(jsonParser, new new TypeReference<Foo<T>>() {})
最佳答案
ObjectMapper
的方法readValue是通用方法。泛型在编译时解析,因此您不能动态地进行此操作。
假设您有以下方法:
Foo<T> <T> bar(parser, TypeReference<Foo<T>> reference) {
...
return mapper.readValue(jsonParser, reference);
}
您不能这样称呼它:
TypeReference<Foo<T>> reference;
switch (value) {
case "X":
reference = new TypeReference<Foo<AbstractResponse>(){};
break;
case "Y":
reference = new TypeReference<Foo<String>(){};
break;
}
bar(parser, reference);
但是您可以执行以下操作:
switch (value) {
case "X":
bar(parser, new TypeReference<Foo<AbstractResponse>(){});
break;
case "Y":
bar(parser, new TypeReference<Foo<String>(){});
break;
}