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

时间:2015-10-19 01:57:44

标签: java json string generics jackson

我看过很多与我的以下查询相关的帖子,但无法找到确切的处理方法: 我的课程如下:

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

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

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使用相关的帖子,但是无法确切知道如何使其适合我的上述用例。

我的主要目标是MyClass实际上应该充当一个util类,而不知道在编译时它将输入json字符串转换为什么Java对象。它应该仅在运行时决定。

任何帮助都将受到高度赞赏!

非常感谢和最诚挚的问候

1 个答案:

答案 0 :(得分:0)

以下解决方案适合您。有一个类型为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");