Jackon json 字符串到 Java 对象使用泛型

Jackon json string to Java object using generics

我已经看到许多与我的以下查询相关的帖子,但无法准确找到如何处理此问题: 我有一个 class 如下:

  public class MyClass<T> implements IMyInterface<String, T> {

       @Override
       public T myMethod(String jsonString) {
           ObjectMapper mapper = new ObjectMapper();
           //T result = mapper.readValue(jsonString, T.class) //for sure T.class does not make sense, but what is the alternative ?
       }
}

我想将此 class 用作实用程序 class,供任何可以将其 json 字符串传递给 myMethod 并获得所需 Java 映射到他们在实例化 MyClass 时提到的 class 的对象。 举个例子,一个客户端代码

MyClass<MyType1> o1 = new MyClass<MyType1>();
MyType1 myType1 = o1.myMethod(aJsonString);

获取 MyType1

的实例

和另一个执行

的代码
MyClass<MyType2> o2 = new MyClass<MyType2>();
MyType2 myType2 = o2.myMethod(anotherJsonString);

获取 MyType2

的实例

我看到很多与 TypeReference 和 JavaType 用法相关的帖子,但无法准确掌握如何使它们适合我的上述用例。

我的主要 objective 是 MyClass 实际上应该作为一个 util class 在编译时不知道什么是 Java 对象它将转换输入 json串到。它应该只在运行时决定。

任何帮助将不胜感激!

非常感谢和最诚挚的问候

以下解决方案适合您。拥有类型 Class 的私有实例并在构造函数中对其进行初始化。

import org.codehaus.jackson.map.ObjectMapper;

public class MyClass<T> implements IMyInterface<String, T> {

   private Class<T> clazz;

   public MyClass(Class<T> clazz) {
    this.clazz = clazz;
   }

   @Override
   public T myMethod(String jsonString) throws Exception {
       ObjectMapper mapper = new ObjectMapper();
       T result = mapper.readValue(jsonString, clazz); 
       return result;
   }

}

您的客户端代码将是:

MyClass<MyType1> o1 = new MyClass<MyType1>(MyType1.class);
MyType1 myType1 = o1.myMethod(aJsonString); 

添加了第二个问题的答案:

在 spring 上下文文件中,如下定义您的 bean。

<bean id="simpleMyType1Class" class="com.yourpackage.MyClass">
<constructor-arg>
    <!-- this can be any full path to a class -->
   <value>com.yourpackage.MyType1</value> 
</constructor-arg>

在Java代码中,如下获取其bean引用。

MyClass<MyType> o1 = (MyClass)context.getBean("simpleMyType1Class");