2012-06-19 67 views
7

我在CXF中使用Jackson來序列化/反序列化數據。不幸的是,我很難配置CXF/Jackson來反序列化一個JSON數組。我很感謝幫助解決這個問題。如何反序列化JSON數組?

到目前爲止最JSON數據已經在對象格式,即

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

然而,有問題的JSON數據的形式爲:

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

Web服務端點期望有一個「GroupsDto」對象(請參閱以下內容) ,它具有單個屬性 - 一組組,這是通過t傳輸的 他JSON數組。

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

我加入@JsonDeserialize如下的GroupsDto集合屬性,但它不工作。我繼續得到:「無法反序列化GroupsDto的情況下進行START_ARRAY令牌」

public class GroupsDto { 

     private Collection<GroupDto> groups; 

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

檢查這個問題[傑克遜 - 使用loadDataFromNetwork()方法讀取JSON陣列Robospice] [1] [1]:http://stackoverflow.com/questions/18792702/jackson-reading- a-json-array-with-robospice-using-loaddatafromnetwork-method – Sneg

回答

0

你只需要在你的二傳手指定@JsonDeserialize(contentAs=GroupDto.class)。序列化總是在得到解序列總是在集合,或者如果你喜歡,你可以指定兩個字段。

的文檔SerializeDeserialize

代碼示例:

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

感謝您對getter/setter問題的提醒。我在你的例子中注意到你正在限定json數組,即「{\」* list * \「:...}是否有可能在沒有資格的情況下反序列化*如果是的話,怎麼樣? – Ari

+0

沒有資格,在這種情況下,魔術由@ JsonDeserialize註解完成,屬性'contentAs'表示這是一個集合,並將被反序列化爲'ModelClass'。如果你想要你可以將屬性名稱從'list'改爲 –

+0

我知道具體的名字並不重要,但是在沒有名字的情況下我們可以做什麼呢?在你的例子中,你正在閱讀'{ 「list」:[...]}',其中有'list'鍵,但如果沒有鍵(名稱) - 例如'[[...]''?] – Ari

8

如果JSON數據的形式是:

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

你必須使用添加其他類說 '包裝':

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

    public ListDto() { 
    } 
} 

並使用這個類而deserailizing。這種方法對我有用。