2012-05-23 10 views
21

Estoy utilizando esta cosa genial que Spring ofrece: Spring RESTWebService (Version of spring is 3). Si puedo acceder a la URL desde el navegador puedo ver la respuesta JSON, pero desde un extremo de cliente (aplicación Android) iIreceive este mensaje de error:No se puede deserializar la instancia del objeto del token START_ARRAY en Spring 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: org.apache.http.conn.EofSensorInputS[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 

estructura MiObjeto es el mismo que el de la aplicación del lado del servidor.

he tratado de solicitar al servidor de esta manera:

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

O así:

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

Pero sigue siendo el mismo error que el anterior. No puedo entender lo que me falta en este punto, cualquier idea o sugerencia sería genial. Gracias.

+0

¿Cuál es la estructura json, cómo se ve MyObject. No hay suficiente información. La única conjetura que veo es que estás obteniendo una matriz del servidor e intentando asignarla a MyObject. – pawelzieba

+0

en el cliente: 'public class Consultant { \t private int id; \t private String firstName; \t private String lastName; \t private String phoneNumber; \t private String jobName; \t private String workAddress; \t privado Fecha de creación; \t private String email; getters y setters} ' –

+0

y la respuesta json es esta:' [{"id": 1, "firstName": "first name", "lastName": "lastname", "jobName": "programmer", "created ": 1328133600000," email ":" [email protected] "," workAddress ":" test "," phoneNumber ":" 0000 "}, {...}, {..}] ' –

Respuesta

14

La solución en una situación similar era mapear a Consultant[].class Esto se aplica si intenta deserializar una matriz JSON de los objetos mapeados.

22

Debe asignarlo a List<Consultant> en lugar de a Consultant.class.

+0

La sugerencia me ayudó en mi caso también – Damilola

+2

¿Podría aclarar esto? Obtengo un error de sintaxis cuando intento la Lista , en cambio tuve que usar la clase MyObject []. – memo

6

Esto está relacionado con Jackson y la forma en que intenta deserializar e inicializar un contenedor desde una matriz.

Si bien mi contexto de uso es un poco diferente, esto puede ayudar a algunos de los que llegan aquí a buscar errores de deserialización específicos de Jackson.

que tenía que hacer así:

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

un foo.json archivo contiene una serie de datos como esto:

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

La siguiente declaración proporciona una lista de matrices de LinkedHashMap, donde ABCD son las claves.

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