2013-01-03 50 views
0

我試圖將json api響應映射到對象,並且IntelliJ正在抱怨。這是說cannot resolve method readValue(java.lang.String, java.lang.Object[]);。我意識到我沒有通過正確的參數,但我試過responseClass.classresponseClass.getClass()沒有運氣。如何將正確的對象傳遞給mapper.readValue()

用法:

MyClass myClass = new MyClass(); 
myClass.setResponseClass(User.class); 

定義:

MyClass { 
    private Object responseClass; 

    public void setResponseClass(Object responseClass) { 
     this.responseClass = responseClass; 
    } 

    public Object getResponseClass() { 
     return responseClass; 
    } 

    public void getApiResponse() { 
     //some code here 

     ObjectMapper mapper = new com.MyApp.Utility.ObjectMapper(); 

     //some code here 

     //I've tried responseClass.class and responseClass.getClass(), it didn't like either of them 
     mapper.readValue(response, responseClass); 

     //more code here 
    } 
} 
+0

爲什麼不將** responseClass **聲明爲** private Object responseClass **?當你想獲得一個實例對象的類對象時,做出responseClass.class或responseClass.getClass()將不起作用,因爲你正在獲得一個類對象的類對象。 – BevynQ

+0

什麼是'com.MyApp.Utility.ObjectMapper'?您是否包裝了Jackson ObjectMapper?此外,你已經抹去了你的類型被映射,通過將其存儲爲一個「對象」。 – Perception

回答

2

這是映射JSON響應一個非常奇怪的方式對象,使用傑克遜。我假設你只是想能夠使用工具類映射任意類?這是一個更簡單的方法來完成這個的一個例子。請注意,這個使用隨您的傑克遜發行了ObjectMapper類:

public class JSONUtil { 
    private ObjectMapper mapper = new ObjectMapper(); 

    public JSONUtil() { 
     super(); 
     // Set ObjectMapper configuration and properties here 
    } 

    public <T> T deserialize(final String response, final Class<T> responseClass) { 
     if(response == null || responseClass == null) return null; 

     return mapper.readValue(response, responseClass); 
    } 
} 

現在,你可以仍然JSON使用您發佈的類映射你的迴應,有一些修改:

public class MyClass<T> { 
    private Class<T> responseClass; 

    public MyClass(final Class<T> responseClass) { 
     super(); 
     this.responseClass = responseClass; 
    } 

    public void getApiResponse(final String response) { 

     final ObjectMapper mapper = new ObjectMapper(); 
     final T values = mapper.readValue(response, responseClass); 

     //more code here 
    } 
} 

並使用它:

MyClass<User> myClass = new MyClass<User>(User.class); 
myClass.getApiResponse(someJsonString); 
+0

感知......如果這是傑克遜的一個奇怪的實現,你能指點我一個更標準化的方式嗎?我想知道什麼是好的做法。感謝您的詳細迴應和努力... +1 – Webnet

+0

@Webnet - 也許我不應該說'奇怪',但我真的從來沒有見過任何人包裝'ObjectMapper',它本身很大程度上是一個具有重要數字的外觀對象的方法。你有這樣的特殊原因嗎? – Perception

+0

我是基於我工作中的一個人做的。包裝只存在用配置設置覆蓋構造函數。我需要對默認設置進行一些研究,看看是否有必要,但我還沒有這樣做。 – Webnet