Web服务响应json序列化列表
我试图将对象列表从服务器传输到使用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字符串用来代替球衣+杰克逊
的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);读它