2013-05-05 73 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 
     } 

    }