Retrofit2 で応答 JSON としてカスタム クラスを実装する際に問題が発生しています。
呼び出しが成功し、(HttpLoggingInterceptor を使用して) 本文をログに記録すると、JSON が正しくフェッチされていることがわかります。
唯一の問題は、作成したカスタム クラスに解析されないことです。
これが私のServiceGeneratorです:
public class ServiceGenerator
{
//Base url for the API
public static final String API_BASE_URL = "http://base.url";
private static Retrofit.Builder GSONBuilder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
public static <T> T createJSONService(Class<T> serviceClass)
{
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient.addInterceptor(logging);
Retrofit retrofit = GSONBuilder.client(httpClient.build()).build();
return retrofit.create(serviceClass);
}
}
ServiceInterface は次のとおりです。
public interface ServiceInterface
{
class UserResponse
{
public int id;
public String email;
public String created_at;
@Override
public String toString()
{
return "UserResponse{" +
"id: " + id +
", email: " + email +
", created_at: " + created_at +
"}";
}
}
@GET("user/{userId}")
Call<UserResponse> currentUser(@Path("userId") int userId);
}
そして、これは私が実際にそれを呼んでいるところです:
public void getUser(int userId)
{
ServiceInterface clientCreate = ServiceGenerator.createJSONService(ServiceInterface.class);
Call<ServiceInterface.UserResponse> callCreate = clientCreate.currentUser(userId);
callCreate.enqueue(new Callback<ServiceInterface.UserResponse>()
{
@Override
public void onResponse(Call<ServiceInterface.UserResponse> call, Response<ServiceInterface.UserResponse> response)
{
ServiceInterface.UserResponse user = response.body();
if (user == null)
{
System.out.println("error");
}
else
{
System.out.println(user.toString());
//This line gets printed, but the class is empty
//What it should show: UserResponse{id: 5, email: "test@email.com", created_at: "2016-03-02"}
//What it actually shows: UserResponse{id: 0, email: null, created_at: null}
}
}
@Override
public void onFailure(Call<ServiceInterface.UserResponse> call, Throwable t)
{
System.out.println("Fail: " + t.getMessage());
}
});
}
GsonConverter が応答をカスタム クラス (UserResponse) に変換しない理由はありますか?
さらに明確にするために、実際の JSON 応答 (Postman を使用) を次に示します。
{"id": 5, "email": "test@email.com", "created_at": "2016-03-02"}
前もって感謝します!
編集1:
興味のある方へ。
String を戻り値の型として使用すると、実際にはすべてのデータが String に書き込まれることがわかりました。
つまり、障害は変換にあるということです。途中のどこかで GSONBuilder を間違えたと思います。