0

我在 Retrofit2 中将自定义类实现为响应 JSON 时遇到问题。

调用成功,当我记录正文(使用 HttpLoggingInterceptor)时,我可以看到 JSON 已正确获取。

唯一的问题是它没有解析到我创建的自定义类中。

这是我的服务生成器:

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);
    }
}

这是服务接口:

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:

对于任何有兴趣的人。

我刚刚发现,如果我使用字符串作为返回类型,它实际上会将所有数据写入字符串。

所以这意味着错误在于转换。我认为在某个地方我在 GSONBuilder 上犯了一个错误。

4

0 回答 0