2011-11-24 38 views
9

Tôi có một file Json trông như thế này:Làm thế nào để deserialize JSON tập tin bắt đầu với một mảng ở Jackson?

[ 
    { "field":"val" }, 
.... 
] 

Tôi có đối tượng Java đại diện cho đối tượng duy nhất và bộ sưu tập của họ:

public class Objects{ 

    public Collection<List> myObject; 
} 

Tôi muốn deserialize JSON sử dụng ObjectMapper.

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(in, Objects.class); 

Nhưng tôi nhận được:

11-24 23:19:19.828: W/UpdateService(6084): org.codehaus.jackson.map.JsonMappingException: 
Can not deserialize instance of com.project.my.Objects out of START_ARRAY token 

Trả lời

20

Hãy thử

mapper.readValue(in, ObjectClass[].class); 

đâu objectClass là một cái gì đó như:

public class ObjectClass { 
    String field; 

    public ObjectClass() { } 

    public void setField(String value) { 
     this.field = value; 
    } 
    } 

Lưu ý: trong phiên bản mà bạn đã viết của lớp Objects, bạn đỏ khai báo một bộ sưu tập danh sách (tức là một danh sách các danh sách), đó không phải là những gì bạn muốn. Bạn có thể muốn có một số List<ObjectClass>. Tuy nhiên, nó đơn giản hơn nhiều chỉ để làm YourObject[].class khi deserializing với Jackson, và sau đó chuyển đổi thành một danh sách sau đó.

0

Truyền một mảng hoặc loại danh sách hoạt động, như @dmon đã trả lời.

Đối với lợi ích của sự hoàn chỉnh, đó cũng là một cách tiếp cận gia tăng nếu bạn muốn đọc nội dung một-by-one:

Iterator<Objects> it = mapper.reader(Objects.class).readValues(in); 
while (it.hasNext()) { 
    Objects next = it.next(); 
    // ... process it 
} 

này rất hữu ích nếu bạn có danh sách khổng lồ hoặc trình tự của các đối tượng; hoặc có kèm theo JSON Array, hoặc chỉ các giá trị mức gốc được phân tách bằng dấu cách hoặc dòng dữ liệu.

4

Bạn có thể trực tiếp nhận được một danh sách thông qua các cách sau:

List<ObjectClass> objs = 
    mapper.readValue(in, new TypeReference<List<ObjectClass>>() {}); 
Các vấn đề liên quan