2013-05-16 11 views
12

Gsonを使用してJSONレスポンスを解析する際に問題があります。Gsonを使用したカスタムJSONデシリアライザ

JSON文字列:

response: [ 
    2, { 
    owner_id: 23972237, 
    album_id: 25487692, 
    title: 'album not new' 
    }, { 
    owner_id: 23972237, 
    album_id: 25486631, 
    title: 'фыв' 
    } 
] 

は、私はこれらの2つのクラスがあります。

public class VkAudioAlbumsResponse { 
    public ArrayList<VkAudioAlbum> response; 
    public VkError error; 
} 

public class VkAudioAlbum { 
    public int owner_id; 
    public int album_id; 
    public String title; 
} 

をしかし、私は、この使用してGsonを解析例外があります。 これは、レスポンス配列の最初の要素はオブジェクトではなく整数なので、これがわかります。

問題はどういうわけか解決できますか?

答えて

30

custom deserializerを書かなければなりません。

まず、あなたが既に持っている2よりもさらに新しいクラスを含める必要があります:

public class Response { 
    public VkAudioAlbumsResponse response; 
} 

そしてカスタムデシリアライザ、これと似たような必要があります。

を私はこのような何かをしたいです
private class VkAudioAlbumsResponseDeserializer 
    implements JsonDeserializer<VkAudioAlbumsResponse> { 

    @Override 
    public VkAudioAlbumsResponse deserialize(JsonElement json, Type type, 
     JsonDeserializationContext context) throws JsonParseException { 

    JsonArray jArray = (JsonArray) json; 

    int firstInteger = jArray.get(0); //ignore the 1st int 

    VkAudioAlbumsResponse vkAudioAlbumsResponse = new VkAudioAlbumsResponse(); 

    for (int i=1; i<jArray.size(); i++) { 
     JsonObject jObject = (JsonObject) jArray.get(i); 
     //assuming you have the suitable constructor... 
     VkAudioAlbum album = new VkAudioAlbum(jObject.get("owner_id").getAsInt(), 
              jObject.get("album_id").getAsInt(), 
              jObject.get("title").getAsString()); 
     vkAudioAlbumsResponse.getResponse().add(album); 
    } 

    return vkAudioAlbumsResponse; 
    } 
} 

その後、あなたはあなたのようなJSONをデシリアライズする必要があります。このAPPRで

GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(VkAudioAlbumsResponse.class, new VkAudioAlbumsResponseDeserializer()); 
Gson gson = gsonBuilder.create(); 
Response response = gson.fromJson(jsonString, Response.class); 

osonは、JSONをResponseクラスに逆シリアル化しようとすると、JSON応答の名前と一致するそのクラスの属性がresponseであることが分かります。

はその後、この属性のタイプVkAudioAlbumsResponseであることを認識し、それはJSONレスポンスの残りの部分を処理している、それを解析するために作成したカスタム・デシリアライザを使用し、VkAudioAlbumsResponseのオブジェクトを返します。

注:デシリアライザへのコードは非常に簡単ですので、私はあなたがそれを理解するには何の問題もないだろうと思います...さらに情報については、私が作成することを好む場合でも、Gson API Javadoc

+0

グレート答えを見ます)新しいクラスを作るのではなく私的なメソッド; –

+1

@MattiaRuggiero私はその特定の責任を持って別のクラスを好む - 小さなクラスをたくさん持つことは、あなたがそれらをはっきりと整理する限り、常に良いものです... – MikO

関連する問題