2013-03-14 2 views
1

Я пытаюсь передать список объектов с сервера клиенту с помощью веб-службы. Данные должны быть переданы в формате json. Я использую трикотаж для реализации JAX-RS и gson для десериализации строки json на стороне клиента. Я продолжал получать ошибку синтаксического анализа, хотя я использовал рекомендуемую практику для десерилизации списка с помощью gson (см. Ниже). Я выяснил, что строка json, которую я получаю в ответе, отличается от той, которую я должен получить для того, чтобы десантилизатор gson работал.ответ веб-службы json сериализованный Список <Object> не удалось десериализовать

Это réponse я получаю от веб-сервиса:

{"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"}]

В начале первой строки вы можете увидеть добавленную «активность» заголовка/обертки.

Вот код веб-сервис:

@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, трикотаж + JAXB используется вместо джерси + Джексоном

ответ

0

из 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); 

Смежные вопросы