如何动态更改在Jackson的readvalue中传递的Type-Reference?

时间:2019-01-08 09:17:54

标签: java generics jackson

我有两种类型的TypeReferences,将在杰克逊的readValue方法中传递。

x= list((df['col1']-df['col2']).abs())
x.index(max(x))

在传递这两个引用中的任何一个时,如何使杰克逊readValue正常工作

由于我正在处理Http调用,因此我尝试发送自定义错误代码,并根据此代码更改在readValue方法中传递的Type-reference,该方法有效。但我正在寻找一种更有效的解决方案。

要使其正常工作,我可以使用以下方法:

1. Foo<AbstractResponse>
2. Foo <String>

或这个

mapper.readValue(jsonParser, new TypeReference<Foo<AbstractResponse>(){})

但这是预期的结果:

mapper.readValue(jsonParser, new TypeReference<Foo<String>(){})

1 个答案:

答案 0 :(得分:1)

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;
 }