2012-05-23 2 views
21

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

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

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

+0

Какова структура json, как выглядит MyObject. Мало информации. Единственное, что я вижу, это то, что вы получаете массив с сервера и пытаетесь сопоставить его с MyObject. – pawelzieba

+0

в клиенте: 'public class Consultant { \t private int id; \t private String firstName; \t private String lastName; \t private String phoneNumber; \t private String jobName; \t частный струнный workAddress; \t частные Дата создания; \t частный адрес электронной почты; getters и seters} ' –

+0

, и ответ json таков:' [{"id": 1, "firstName": "first name", "lastName": "last name", "jobName": "programmer", "created ": 1328133600000," электронная почта ":" [email protected]», "workAddress": "тест", "PHONENUMBER": "0000"}, {...}, {..}] ' –

ответ

14

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

22

Необходимо нанести на карту List<Consultant>, а не на Consultant.class.

+0

Совет помог мне в моем случае также – Damilola

+2

Не могли бы вы это уточнить? Я получаю синтаксическую ошибку при попытке List , вместо этого мне пришлось использовать MyObject []. Class – memo

6

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

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

Я должен был сделать это следующим образом:

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

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

[{ "A": "TYMH", "B ":" datab "," C ":" DLJQ "," D ":" datad "}, {" A ":" TYMH "," B ":" datab "," C ":" DLJQ "," D ":" datad "}]

Следующая инструкция дает вам ArrayList LinkedHashMap, где ABCD - это ключи.

List list = mapper.readValue(new File("D:\\...\\foo.json"), List.class); 
Смежные вопросы