2015-10-19 19 views
0

我看过无数的帖子与我下面的查询,但无法找到究竟是如何处理这个问题: 我有一个类,如下:JSON字符串到Java对象使用泛型

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对象。它应该只在运行时才决定。

任何帮助将不胜感激!

非常感谢和最好的问候

回答

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

第二个问题的答案ADDED:

在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"); 
+0

谢谢。但是如果我需要通过属性/构造函数注入(通过XML配置)通过Spring实例化MyClass?我如何注入“clazz”? – lbvirgo

+0

看看你的第二个答案。 – kswaughs

+0

第二个问题与原文不相关,因为这与春季框架有关。我建议你在这种情况下发布一个新问题,因为我有可能不知道后者的答案,你的问题可能无法达到各自的春季科技人员。 – kswaughs