0

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 を間違えたと思います。

4

0 に答える 0