2

基本的な情報を含むすべてのリクエストに対して同じ汎用コンテナーを返す Web サービスがあります。たとえば、ユーザーのリストを要求すると、次の応答が返されます。

{
   "error":false,
   "message":"Message goes here",
   "items":[
      {
         "id":1,
         "name":"Test User 1"
      },
      {
         "id":2,
         "name":"Test User 2"
      }
   ]
}

別のリソースをリクエストする場合、アイテムのリストのみが異なります。

{
   "error":false,
   "message":"Message goes here",
   "items":[
      {
         "id":3,
         "artist":"Artist 1",
         "year":2001
      },
      {
         "id":4,
         "artist":"Artist 2",
         "year":1980
      }
   ]
}

私のクライアントでは、GSON を使用して Java オブジェクトに応答をマップしたいと考えています。

public class ArtistRestResponse {
    private boolean error;
    private String message = "";
    private Artist[] items;     
}

ただし、共通フィールドをリファクタリングして、リソースごとにクラスを作成しないようにするために、一般的に型指定されたRestResponse<T>クラスを作成することは論理的なステップです。

public class RestResponse<T> {
   private boolean error;
   private String message = "";
   private T[] items;           
}

使えないのが難点RestResponse<Artist> = new Gson().fromJson(json, RestResponse<Artist>.class);。そのような構造を使用する方法はありますか、またはサーバーの応答を処理するより良い方法はありますか?

4

1 に答える 1

2

ここを使うべきTypeTokenです。

final TypeToken<RestResponse<Artist>> token = new TypeToken<RestResponse<Artist>>() {};
final Type type = token.getType();
final Gson gson = new Gson();

final RestResponse<Artist> response = gson.fromJson(json, type);
于 2013-03-17T14:40:02.360 に答える