Web服务响应json序列化List <object>无法反序列化</object>

时间:2013-03-14 10:42:25

标签: web-services rest gson json

我正在尝试使用Web服务将对象列表从服务器传输到客户端。 数据应以json格式传输。 我正在使用jersey进行JAX-RS实现,并使用gson对客户端的json字符串进行反序列化。 我不断得到一个解析错误,即使我正在使用推荐的gson列表去除方法(见下文)。 我发现我在响应中得到的json字符串与我应该收到的json字符串不同,以便gson deserilizer工作。

这是我从网络服务获得的反应:

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

但这是我应该收到的正确响应,以便gson将字符串反序列化为List: [{"id":3,"activityName":"c"},{"id":3,"activityName":"c"},{"id":3,"activityName":"c"}]

您可以在第一个字符串的开头看到添加的标题/包装“活动”。

以下是网络服务代码:

@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();

      }

}

****好的我相信我找到了答案****

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

这也有帮助: JSON POJO support

按钮行是如果在web.xml中没有明确定义,则使用jersey + jaxb代替jersey + jackson

1 个答案:

答案 0 :(得分:0)

来自Web服务器返回的json字符串,它清楚地表明响应有一个对象,该对象的名称是具有活动数组的活动。

所以,如果您尝试使用此结构来阅读响应。


    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 Library

阅读它

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