2013-06-28 37 views
5

Tôi có một đối tượng sử dụng một org.apache.commons.collections.list.LazyList cho một trong các trường của nó, đó là JSON được tuần tự hóa. JSON trông như thế này:deserialize lazylist bằng cách sử dụng jackson

 "myObject": ["org.apache.commons.collections.list.LazyList", [ 
      { 
       "attr1": "asdasd", 
       "attr2": 1234 
      } 
     ]], 

các lĩnh vực đối tượng trông như thế này:

List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory) 

Tuy nhiên cố gắng để deserialize JSON trên sử dụng một Jackson ObjectMapper thất bại, vì nó không thể tìm thấy một constructor mặc định cho một LazyList - có ý nghĩa. Nhưng làm cách nào tôi có thể xác định cách trường này có thể được deserialized?

Thông báo lỗi:

Không constructor mặc định cho [loại bộ sưu tập; lớp org.apache.commons.collections.list.LazyList, chứa [kiểu đơn giản, lớp foo.bar.MyObject]]

Bounty-chế:

Để thu thập tiền thưởng, nhu cầu câu hỏi này để được trả lời bằng cách sử dụng bộ chỉnh sửa jackson tùy chỉnh - trình gỡ bỏ tùy chỉnh không được là trường cụ thể! Do đó không có giải pháp nào bằng cách sử dụng các triển khai tùy chỉnh của một LazyList cho một kiểu cụ thể sẽ trả lời câu hỏi này một cách đầy đủ.

+0

Bạn nên bao gồm văn bản tiền thưởng cho câu hỏi, vì nó có liên quan để trả lời đúng. –

+0

Không có cách nào để làm cho 100% này tương thích với mọi thứ. Vì dữ liệu bị mất, bạn phải đưa ra các giả định, chẳng hạn như triển khai danh sách sao lưu và nhà máy của danh sách LazyList. Cách duy nhất để làm điều này mà không làm cho những giả định đó là thêm thông tin đó vào JSON được tuần tự hóa bằng cách nào đó. Bạn có thể viết serializer của riêng bạn để sử dụng reflection để thêm thông tin đó, và deserializer sử dụng thông tin đó (một lần nữa, sử dụng reflection) tạo đối tượng LazyList, nhưng bạn vẫn đang tạo các giả định, chẳng hạn như các nhà máy của bạn có các nhà xây dựng 0 arg. –

+0

Thực hiện tìm kiếm google cho "phản chiếu java" và sử dụng để nhận các biến 'collection' và' factory' được bảo vệ cho serializer của bạn và các hàm tạo cho trình deserializer của bạn. Hoặc xem các câu hỏi khác để được trợ giúp, chẳng hạn như: http://stackoverflow.com/questions/735230/java-reflection –

Trả lời

1

Giải pháp bên dưới hoạt động trên cả đối tượng Bộ sưu tập danh sách và Bản đồ, nó cũng có thể hoạt động trên máy của bạn.

@JsonDeserialize(contentAs=MyObject.class) 
private List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory); 
Các vấn đề liên quan