Я пытаюсь передать список объектов с сервера клиенту с помощью веб-службы. Данные должны быть переданы в формате 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 используется вместо джерси + Джексоном