2013-03-14 114 views
1

我试图将对象列表从服务器传输到使用Web服务的客户端。 数据应该以json格式传输。 我使用泽西JAX-RS实现和gson来反序列化客户端上的json字符串。 即使我使用gson的列表deserilization的推荐做法(见下文),我仍然得到一个解析错误。 我发现我在响应中获得的json字符串与我为了使gson deserilizer工作而收到的json字符串不同。Web服务响应json序列化列表<Object>无法反序列化

这是我从网络服务得到了我的回复:

{"activity":[{"activityName":"c","id":"3"},{"activityName":"c","id":"3"},{"activityName":"c","id":"3"}]}

但是,这是正确的反应,我应该接受为了使GSON字符串反序列化到一个列表: [{"id":3,"activityName":"c"},{"id":3,"activityName":"c"},{"id":3,"activityName":"c"}]

您可以在第一个字符串的开头看到添加的头文件/包装器“activity”。

这里是Web服务代码:

@Path("ws") 
public class IiwsServices { 

@POST 
@Path("/listActivities") 
@Produces(MediaType.APPLICATION_JSON) 
public List<Activity> listActivities() { 

    List<Activity> list = new ArrayList<Activity>(); 

    Activity act = new Activity(); 
    act.setId(1); 
    act.setActivityName("a"); 
    list.add(act); 

    act.setId(2); 
    act.setActivityName("b"); 
    list.add(act); 

    act.setId(3); 
    act.setActivityName("c"); 
    list.add(act); 
    return list; 
} 

这是客户端代码:

public class Main { 
public static void main(String[] args) { 
    try { 

     Client client = Client.create(); 

     WebResource webResource = client 
      .resource("http://localhost:8080/iiws.ws.test/ws/listActivities"); 

     ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON) 
        .post(ClientResponse.class); 

     if (response.getStatus() != 200) { 
      throw new RuntimeException("Failed : HTTP error code : " 
      + response.getStatus()); 
     } 

     String output = response.getEntity(String.class); 

     System.out.println(output); 

     List<Activity> list = new ArrayList<Activity>(); 

     Activity act = new Activity(); 
     act.setId(1); 
     act.setActivityName("a"); 
     list.add(act); 

     act.setId(2); 
     act.setActivityName("b"); 
     list.add(act); 

     act.setId(3); 
     act.setActivityName("c"); 
     list.add(act); 

     Gson gson = new GsonBuilder().create(); 
     String jsonString = gson.toJson(list); 

     System.out.println(jsonString); 

     List<Activity> list = gson.fromJson(output, new TypeToken<List<Activity>>(){}.getType()); // <-- Deserialize exception here 

     for (int i = 0; i < list.size(); i++) { 
      Activity x = list.get(i); 
      System.out.println(x); 
     } 

     } catch (Exception e) { 

     e.printStackTrace(); 

     } 

} 

**** OK,我相信我已经找到了答案****

确定终于找到解决方案 在这里,我找到了一个类似的问题后搜索泽西岛和杰克逊搜索: Jersey client can not deserializable json services

这有助于以及: JSON POJO support

按钮线是,如果在web.xml,球衣+ JAXB没有明确地定义从JSON字符串用来代替球衣+杰克逊

回答

0

的web服务器返回,它清楚地表明响应具有名称是具有活动数组的活动的对象。

所以如果你尝试这个结构来读取响应。

 

    public class Activity{ 
     private int id; 
     private String activityName; 
     public int getId() { 
      return id; 
     } 
     public void setId(int id) { 
      this.id = id; 
     } 
     public String getActivityName() { 
      return activityName; 
     } 
     public void setActivityName(String activityName) { 
      this.activityName = activityName; 
     } 
    } 

    public class Response{ 
     private List activity; 

     public List getActivity() { 
      return activity; 
     } 

     public void setActivity(List activity) { 
      this.activity = activity; 
     } 

    } 

,并使用GSON图书馆

 

    Gson gson = new Gson(); 
    Response response = gson.fromJson(json, Response.class); 

读它