2015-06-19 30 views
6

Tôi có một phản hồi nào từ URL mà trông giống như:đồ RestTemplate getForEntity vào danh sách các đối tượng

{"seq":1,"id":"Test1","changes":[{"rev":"1-52f5cdf008ecfbadf621c2939af7bd80"}]} 
{"seq":2,"id":"Test2","changes":[{"rev":"1-8ce403a89dc5e7cb4187a16941b3fb7d"}]} 
{"seq":3,"id":"Test3","changes":[{"rev":"1-52as7ddfd8ecfbadf621c2939af7bd80"}]} 
{"seq":4,"id":"Test4","changes":[{"rev":"1-6yy03a89dc5e7cb45677a16941b3fb7d"}]} 

Nếu đối tượng ánh xạ là String, sau đó nhận được tất cả những thay đổi thức ăn.

ResponseEntity<String> responseEntity = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, String.class); 

Trong khi đó, nếu tôi xảy ra để sử dụng một đối tượng giá trị tùy chỉnh, somethings như:

public class KnChanges { 
private long seq; 
private String id; 
private List changes; 

với getter và setter, sau đó tôi nhận được chỉ là thay đổi chi tiết doc đầu tiên. Ngay cả khi KnChanges [] (mảng) được sử dụng, chỉ thu được thay đổi đầu tiên.

Bạn có thể vui lòng trợ giúp về cách cấu trúc danh sách JSON được đề cập ở trên có thể được ánh xạ tới một đối tượng không?

Cảm ơn Harsha

Trả lời

4
ParameterizedTypeReference<List<KnChanges>> responseType = new ParameterizedTypeReference<List<KnChanges>>() {}; 
ResponseEntity<List<KnChanges>> resp = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, responseType); 
List<KnChanges> list = resp.getBody(); 
+7

Bạn có thể giải thích câu trả lời thay vì chỉ đăng mã không? – bish

1

Một số người hỏi cho một câu trả lời tốt hơn với một số Giải thích. Vì vậy, đây đó là:

Như sujim nêu: Bạn cần phải

ParameterizedTypeReference<List<KnChanges>> responseType = new ParameterizedTypeReference<List<KnChanges>>() {}; 
ResponseEntity<List<KnChanges>> resp = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, responseType); 
List<KnChanges> list = resp.getBody(); 

Giải thích:

Tham số cuối cùng của cuộc gọi phương thức trao đổi định nghĩa các lớp đó được khởi tạo khi phản ứng Đã nhận. Dữ liệu đáp ứng sau đó sẽ được ánh xạ tới đối tượng kết quả. Vì vậy, bạn cần một List.class ở vị trí nắm tay. Vì bạn mong đợi một mảng JSON. Bây giờ bạn cần xác định loại nội dung của số đó List. Ở đây Java's type erasure ném một số đá theo cách của bạn. Khi Java loại bỏ thông tin kiểu chung tại thời gian biên dịch, bạn không thể chỉ xác định List được mong đợi là List<KnChanges>.class. "May mắn thay" có một hack;) Và hack đó là new ParameterizedTypeReference<List<KnChanges>>() {}. Với điều kiện đối tượng đó, ứng dụng có thể đọc thông tin kiểu generic trong thời gian chạy. Và do đó có thể ánh xạ dữ liệu đã nhận tới các đối tượng Java của bạn.

Là một lưu ý phụ: Có một số cách triển khai bản hack đó. Nó thường được sử dụng cho các hệ thống phun phụ thuộc hoặc các công cụ ánh xạ, khi mà việc xóa bỏ kiểu đôi khi có thể là một vấn đề. Googles Guava cũng cung cấp một triển khai. See the code để biết thêm thông tin. Ở đó bạn cũng có thể tìm hiểu cách nó được thực hiện, nếu bạn thích.

Các vấn đề liên quan