我有两种类型的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;
 }

10-06 16:03