Подтвердить что ты не робот

Невозможно десериализовать экземпляр объекта из токена START_ARRAY в Spring 3 REST Webservice

Я использую эту классную вещь Spring предлагает: Spring RESTWebService (версия Spring равна 3). Если я получаю доступ к URL-адресу из браузера, я могу увидеть ответ JSON, но с конечной точки клиента (приложение для Android) iIreceive это сообщение об ошибке:

Caused by: org.springframework.web.client.ResourceAccessException: 
    I/O error: Can not deserialize instance of MyObject out of START_ARRAY token
  at [Source: [email protected]; line: 1, 
    column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: 
    Can not deserialize instance of MyObject  out of START_ARRAY token
  at [Source: [email protected]; line: 1, column: 1]
   at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:466)
   at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:414)
   at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:234)
   at com.be.android.locateconsultants.resources.AsyncTaskRESTServiceCaller.doInBackground(AsyncTaskRESTServiceCaller.java:43)
   at com.be.android.locateconsultants.resources.AsyncTaskRESTServiceCaller.doInBackground(AsyncTaskRESTServiceCaller.java:1)
   at android.os.AsyncTask$2.call(AsyncTask.java:252)
   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
   ... 4 more

 Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize 
    instance of MyObject  out of START_ARRAY token
  at [Source: [email protected]; line: 1, column: 1]
   at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:198)
   at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeUsingCreator(BeanDeserializer.java:565)
   at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:365)
   at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2395)
   at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1655)
   at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:135)
   at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:154)
   at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:74)
   at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:632)
   at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:618)
   at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:459)
   ... 10 more

Структура MyObject такая же, как у приложения на стороне сервера.

Я попытался запросить сервер следующим образом:

final String url = ".....";
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Consultant> responseEntity = restTemplate.getForEntity(
            url, Consultant.class);

Или вот так:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(headers);
ResponseEntity<MyObject> response = restTemplate
            .exchange("....",HttpMethod.GET, entity, MyObject.class);
System.out.println("RESPONSE: " + response.getBody());

Но все та же ошибка, что и выше. Не могу понять, чего я не вижу на данный момент, любая идея или намеки были бы замечательными. Спасибо.

4b9b3361

Ответ 1

Решение в аналогичной ситуации состояло в том, чтобы отобразить на Consultant[].class Это применяется, если вы попытаетесь десериализовать массив JSON ваших сопоставленных объектов.

Ответ 2

Вы должны сопоставить его с List<Consultant>, а не с Consultant.class.

Ответ 3

Это связано с Джексоном и тем, как вы пытаетесь десериализовать и инициализировать контейнер из массива.

В то время как мой контекст использования немного отличается, это может помочь тем, кто получает здесь от поиска ошибок десериализации, специфичных для Джексона.

Мне пришлось сделать это вот так:

List<Consultant> consultants = Arrays.asList(
    mapper.readValue(myJson.toString(), Consultants[].class)
);

Ответ 4

файл foo.json содержит пакет данных, подобный этому:

[{ "А": "TYMH", "В": "datab", "С": "DLJQ", "Д": "DATAD" },     { "А": "TYMH", "В": "datab", "С": "DLJQ", "Д": "DATAD" }]

Следующий оператор предоставляет вам ArrayList LinkedHashMap, где A B C D - это клавиши.

List list = mapper.readValue(new File("D:\\...\\foo.json"), List.class);