2013-05-05 71 views
0

我使用Jersey作爲客戶端將JSON解析爲Java對象, 問題是我正在使用一種服務,該服務返回不同類型的應該映射到不同的響應Java對象,所以我需要一種方法來進入解析過程並做出一個任意的決定,告訴澤西什麼是每次解析的確切類型的對象。每次解析Json對不同Java對象的響應

編輯:

例如,如果我有Java類A,B和C和JSON響應如下:

Data{ 
    -list { 
     -0 :{Result should be mapped to A} 
     -1 :{Result should be mapped to B} 
     -2 :{Result should be mapped to C} 
    } 
} 

list是ArrayList的(或者可以是超級的ArrayList的三班級)。現在,當我要求Jersey分析這個JSON響應時,它將在處理list時發現一個ArrayList,並且不知道要解析的對象的確切類型,因此它將-0,-1,-2內的數據轉換爲一個linkedHashMap作爲一個鍵/值對。

+0

你試過用[Jackson](http://jackson.codehaus.org/)嗎? – joaonlima 2013-05-05 10:19:06

+0

備註 - Jersey是JAX-RS提供者,而不是JSON解析庫。在主題上 - 返回的對象是否有任何共同點?將相關部分的代碼添加到問題中。 – Perception 2013-05-05 10:56:35

+0

我已經在那裏添加了更多的說明 – Montaser 2013-05-05 14:51:36

回答

1

我在球衣客戶端中使用jackson來將json映射到hashMap,但映射器也會爲pojo's工作。希望以下幫助。

將列表元素獲取到數組/列表中。 循環並確定每個元素的正確類。
將每個列表元素及其相應的類名傳遞給處理映射並返回對象的方法。

import ... 
    import com.fasterxml.jackson.databind.ObjectMapper; 

    public class RequestProcessor { 
     void jerseyClient(){ 

      //rest request 
      WebResource resource = ... 
      ClientResponse responseContent = resource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 

      List list = parseJSonResponse(responseContent); 
      for (String jsonListElement : list){ 
       //determine correct class for jsonListElement 

       //Pass jsonListElement and class name to mapper method 
       Object obj = mapElementToObject(jsonListElement , className); 

       //do something with obj 
      } 

     } 

     private Object mapElementToObject(String jsonString, String className){ 
      ObjectMapper mapper = new ObjectMapper(); 
      Object obj = mapper.readValue(jsonString, Class.forName(className); 
      return obj; 
     } 

     private List parseJsonResponse(responseContent){ 
      //use regexp to replace unnecessary content in response so you have a string 
      //that looks like -0:{element values}-1:{element values}-2:{element values} 

      //then split the string on "-.*\\:" into a array/list 

      //return the list 
     } 

    }