web-dev-qa-db-fra.com

Impossible de désérialiser une instance d'objet hors du jeton START_ARRAY au printemps 3 REST Service Web

Je me sers de cette offre intéressante Offres du printemps: Printemps RESTWebService (Version du printemps est 3). Si j'accède à l'URL depuis le navigateur, je peux voir la réponse JSON, mais depuis un noeud final client (application Android), je reçois ce message d'erreur:

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.EofSensorInputStream@4076e940; 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: org.Apache.http.conn.EofSensorInputStream@4076e940; 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: org.Apache.http.conn.EofSensorInputStream@4076e940; 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

La structure MyObject est la même que celle de l'application côté serveur.

J'ai essayé de demander le serveur comme ceci:

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

Ou comme ceci:

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

Mais toujours la même erreur que ci-dessus . Je ne peux pas comprendre ce qui me manque à ce stade, toute idée ou allusion serait génial . Merci.

21
Gabriela Radu

La solution dans une situation similaire consistait à mapper vers Consultant[].class Ceci s'applique si vous essayez de désérialiser un tableau JSON de vos objets mappés.

15
Ahto Luuri

Vous devriez le mapper sur List<Consultant> plutôt que sur Consultant.class.

22
pawelzieba

Cela est lié à Jackson et à la façon dont vous essayez de désérialiser et d'initialiser un conteneur à partir d'un tableau.

Bien que mon contexte d'utilisation soit un peu différent, cela peut aider ceux qui s'y rendent en cherchant des erreurs de désérialisation spécifiques à Jackson.

Je devais le faire comme ça:

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

un fichier foo.json contient un lot de données comme ceci: 

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

L'instruction suivante vous donne une liste de tableaux de LinkedHashMap, où A B C D sont les clés.

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