2012-06-19 11 views
7

私はCXF内でJacksonを使用してデータをシリアル化/逆シリアル化しています。残念ながら、JSON配列を逆シリアル化するようにCXF/Jacksonを設定するのは難しいです。私はこの問題を解決する助けに感謝します。この時点までJSON配列を逆シリアル化する方法は?

JSONデータのほとんどは、オブジェクト形式になっている、すなわち

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

しかし、問題のJSONデータの形式は次のとおりです。

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

Webサービスエンドポイントは、単一のプロパティーを持つ "GroupsDto"オブジェクト(次を参照)が であると予想します。グループのコレクションは、 彼はJSONの配列。

@ JsonDeserializeをGroupsDtoコレクションプロパティに追加しましたが、動作しません。私が取得し続ける:「START_ARRAYトークンのうち、GroupsDtoのインスタンスをデシリアライズできない」

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()メソッドを使用してRobospiceとJSON配列を読み取る] [1] [1]:http://stackoverflow.com/questions/18792702/jackson-reading- a-json-array-with-robospice-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'としてデシリアライズされることを示すためのものです。 –

+0

具体的な名前は重要ではありませんが、名前がない場合は何をしますか?あなたの例では、{{キー[list]:[...]} '、キー 'list'を持っていますが、キー(name)がない場合、つまり' [...] 'はどうですか? – Ari

8

JSONデータの形式の場合:

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

あなたは 'ラッパー' と言う別のクラスを追加使用するようになりました。

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

    public ListDto() { 
    } 
} 

そして、このクラスを使用している間は、このクラスを使用してください。このアプローチは私のために働いた。

関連する問題