Ne peut pas desérialiser l'instance de l'objet hors de la commande Start ARRAY au printemps 3 REST Webservice

je me sers de ce truc cool que le printemps offre: Spring RESTWebService (Version du printemps est 3). Si j'accède à L'URL à partir du navigateur, je peux voir la réponse JSON, mais à partir D'un terminal 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.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 de MyObject est la même que celle de l'application côté serveur.

j'ai essayé de demander au 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 encore le même erreur que ci-dessus. Je ne peux pas comprendre ce que je manque à ce point, n'importe quelle idée ou des indices seraient grands. Remercier.

21
demandé sur JJD 2012-05-23 16:16:56

4 réponses

la Solution dans une situation similaire était de faire une correspondance à Consultant[].class Ceci s'applique si vous essayez de desérialiser un tableau JSON de vos objets cartographiés.

14
répondu Ahto Luuri 2015-02-11 08:27:07

Vous devez mapper List<Consultant> plutôt que Consultant.class.

22
répondu pawelzieba 2012-05-23 15:36:00

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

alors que mon contexte d'utilisation est un peu différent, cela peut aider certains qui arrivent ici à partir de la recherche D'erreurs de desérialisation spécifiques à Jackson.

j'ai eu à le faire comme ceci:

List<Consultant> consultants = Arrays.asList(
    mapper.readValue(myJson.toString(), Consultants[].class)
);
8
répondu NathanChristie 2016-05-12 09:10:08

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

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

la déclaration suivante vous donne un tableau de LinkedHashMap, où A B C D sont les clés.

List list = mapper.readValue(new File("D:\...\foo.json"), List.class);
0
répondu Tiina 2018-01-09 01:21:38