私は、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: 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
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());
ただし、上記と同じエラーです。この時点で何が欠けているのかわかりません。アイデアやヒントは素晴らしいでしょう。ありがとうございました。
同様の状況での解決策は、Consultant[].class
これは、マップされたオブジェクトのJSON配列をデシリアライズしようとする場合に適用されます。
List<Consultant>
ではなく、Consultant.class
にマップする必要があります。
これは、ジャクソンと、配列からコンテナをデシリアライズおよび初期化しようとする方法に関連しています。
私の使用状況は少し異なりますが、これはジャクソン固有の逆シリアル化エラーを検索することでここに到達する人を助けるかもしれません。
私はこのようにしなければなりませんでした:
List<Consultant> consultants = Arrays.asList(
mapper.readValue(myJson.toString(), Consultants[].class)
);
ファイルfoo.jsonには、次のようなデータのバッチが含まれています。
[{"A": "TYMH"、 "B": "datab"、 "C": "DLJQ"、 "D": "datad"}、{"A": "TYMH"、 "B": "datab "、" C ":" DLJQ "、" D ":" datad "}]
次のステートメントは、A B C DがキーであるLinkedHashMapのArrayListを提供します。
List list = mapper.readValue(new File("D:\\...\\foo.json"), List.class);