2015-10-19 23 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