2012-05-23 22 views
21

Tôi đang sử dụng điều thú vị này Spring cung cấp: Spring RESTWebService (Phiên bản của Spring là 3). Nếu tôi truy cập vào địa chỉ URL từ trình duyệt tôi có thể thấy phản ứng JSON, nhưng từ một thiết bị đầu cuối khách hàng (ứng dụng Android) iIreceive này thông báo lỗi:Không thể deserialize thể hiện của đối tượng ra khỏi START_ARRAY mã thông báo trong 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: [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 

cấu trúc MyObject là giống như một từ các ứng dụng phía máy chủ.

Tôi đã cố gắng để yêu cầu máy chủ như thế này:

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

Hoặc như thế này:

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

Nhưng vẫn báo lỗi tương tự như trên. Không thể tìm ra những gì tôi đang thiếu tại thời điểm này, bất kỳ ý tưởng hay gợi ý nào sẽ là tuyệt vời. Cảm ơn bạn.

+0

Cấu trúc json là gì, MyObject trông như thế nào. Không đủ thông tin. Đoán duy nhất tôi thấy là bạn đang nhận mảng từ máy chủ và cố gắng ánh xạ nó tới MyObject. – pawelzieba

+0

trong ứng dụng khách: 'Tư vấn cấp công khai { \t id nội bộ cá nhân; \t riêng String firstName; \t Private String lastName; \t chuỗi riêng phoneNumber; \t riêng String jobName; \t chuỗi riêng tư workAddress; \t riêng Ngày tạo; \t email chuỗi riêng tư; getters và setters} ' –

+0

và json phản hồi là:' [{"id": 1, "firstName": "first name", "lastName": "last name", "jobName": "programmer", "được tạo ": 1328133600000," email ":" [email protected] "," workAddress ":" test "," phoneNumber ":" 0000 "}, {...}, {..}] ' –

Trả lời

14

Giải pháp trong tình huống tương tự là ánh xạ tới Consultant[].class Điều này áp dụng nếu bạn cố gắng deserialize một mảng JSON của các đối tượng được ánh xạ của bạn.

22

Bạn nên ánh xạ nó đến List<Consultant> thay vì để Consultant.class.

+0

Mẹo cũng giúp tôi trong trường hợp của tôi cũng là – Damilola

+2

Bạn có thể làm rõ điều này không? Tôi gặp lỗi cú pháp khi thử Danh sách , thay vào đó tôi phải sử dụng MyObject []. – memo

6

Điều này liên quan đến Jackson và cách bạn đang cố gắng deserialize và khởi tạo một container từ một mảng.

Trong khi ngữ cảnh sử dụng của tôi hơi khác một chút, điều này có thể giúp một số người nhận được ở đây từ việc tìm kiếm các lỗi giải mã đặc trưng của Jackson.

tôi phải làm điều đó như thế này:

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

một foo.json tập tin có chứa một loạt các dữ liệu như thế này:

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

Câu lệnh sau cung cấp cho bạn danh sách ArrayList của LinkedHashMap, nơi ABCD là chìa khóa.

List list = mapper.readValue(new File("D:\\...\\foo.json"), List.class); 
Các vấn đề liên quan