2012-06-19 42 views
7

Tôi đang sử dụng Jackson trong CXF để tuần tự hóa/deserialize dữ liệu. Thật không may, tôi gặp khó khăn khi cấu hình CXF/Jackson để deserialize một mảng JSON. Tôi đánh giá cao sự trợ giúp trong việc giải quyết vấn đề.Làm thế nào để Deserialize JSON Array?

Tính đến thời điểm này hầu hết các dữ liệu json đã được định dạng đối tượng, tức là

{ "objectCollection": [ {...}, {...}, {...}... ] }

Tuy nhiên, dữ liệu json trong câu hỏi có dạng:

[ {...}, {...}, {...} ]

Điểm cuối dịch vụ web mong đợi một đối tượng "GroupsDto" (xem sau) có một thuộc tính duy nhất - một tập hợp các nhóm, là được truyền qua t mảng JSON.

@PATH(...) 
public Response createGroups(GroupsDto groups) { 
... 
} 

Tôi đã thêm @JsonDeserialize như sau vào thuộc tính GroupsDto collection, nhưng nó KHÔNG hoạt động. Tôi tiếp tục nhận được: "Không thể deserialize thể hiện của GroupsDto ra khỏi START_ARRAY thẻ"

public class GroupsDto { 

     private Collection<GroupDto> groups; 

     /** 
     * @return the groups 
     */ 
     @XmlElement(name="group") 
     @JsonDeserialize(contentAs=GroupDto.class) 
     public Collection<GroupDto> getGroups() { 
       return groups; 
     } 
... 
} 
+0

Kiểm tra câu hỏi này [Jackson - đọc một mảng JSON với Robospice sử dụng loadDataFromNetwork() phương pháp] [1] [1]: http://stackoverflow.com/questions/18792702/jackson-reading- a-json-array-với-robospice-using-loaddatafromnetwork-method – Sneg

Trả lời

0

Bạn chỉ cần phải xác định @JsonDeserialize(contentAs=GroupDto.class) trong bạn setter. Tính năng tuần tự hóa luôn được bật trên nhận được desserialization luôn ở trên đặt hoặc nếu bạn thích, bạn có thể chỉ định cả trên trường.

Tài liệu cho mẫu SerializeDeserialize

Code:

import java.io.IOException; 
import java.util.List; 

import org.codehaus.jackson.JsonGenerationException; 
import org.codehaus.jackson.map.JsonMappingException; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.annotate.JsonDeserialize; 

public class JacksonDeserialize { 

    public static class ModelClass { 

     private String name; 

     public ModelClass() { 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(final String name) { 
      this.name = name; 
     } 

     public ModelClass(final String name) { 
      super(); 
      this.name = name; 
     } 

     @Override 
     public String toString() { 
      return "ModelClass [name=" + name + "]"; 
     } 

    } 

    public static class ListModelClass { 

     private List<ModelClass> list; 

     @JsonDeserialize(contentAs = ModelClass.class) 
     public void setList(final List<ModelClass> list) { 
      this.list = list; 
     } 

     @Override 
     public String toString() { 
      return "ListModelClass [list=" + list + "]"; 
     } 

    } 

    public static void main(final String[] args) throws JsonGenerationException, JsonMappingException, IOException { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     System.out.println(objectMapper.readValue("{\"list\":[{\"name\":\"name1\"},{\"name\":\"name2\"}]}", 
       ListModelClass.class)); 
    } 

} 
+0

Cảm ơn bạn đã đứng đầu về vấn đề getter/setter. Tôi nhận thấy trong ví dụ của bạn rằng bạn đủ điều kiện trong mảng json tức là "{\" * list * \ ": ...} Có thể deserialize * mà không có * trình độ không? Nếu có, làm thế nào? – Ari

+0

không có đủ điều kiện, phép thuật được thực hiện trong trường hợp này bằng chú thích '@ JsonDeserialize'. Thuộc tính' contentAs' là để chỉ ra rằng đây là một tập hợp và sẽ được deserialized như 'ModelClass' .Nếu bạn muốn bạn có thể thay đổi tên thuộc tính từ' list' thành –

+0

Tôi hiểu rằng tên cụ thể là phi vật chất, nhưng cái gì làm một cái gì đó trong trường hợp không có tên? Trong ví dụ bạn đang đọc trong '{ "list": [...]} ', có khóa 'danh sách', nhưng nếu không có khóa (tên) - nghĩa là' [...] '? – Ari

8

Nếu dữ liệu json có dạng:

[ {...}, {...}, {...} ] 

Bạn phải sử dụng thêm một lớp khác nói 'wrapper':

@JsonIgnoreProperties(ignoreUnknown = true) 
public class ListDto extends ArrayList<GroupDto> { 

    public ListDto() { 
    } 
} 

Và sử dụng lớp này trong khi deserailizing. Cách tiếp cận này làm việc cho tôi.

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