Как использовать Retrofit2 + GSON -> Class с пользовательским объектом?

Я читаю некоторые другие посты внутри stackru, но я не могу заставить его работать.

У меня есть данные, возвращаемые сервером, который имеет следующую форму:

СЕРВЕРНЫЙ ОТВЕТ

{
  "userData": {
    "username": "victor.javier",
    "email": "victor.javier@stackru.com",
    "createdAt": "2016-05-11T09:55:14.720Z",
    "updatedAt": "2016-05-11T09:55:14.720Z",
    "id": "5733018274ddfad25"
  },
  "token": "SkpaNuXdzfrhiH06qGK93EH2ujM37hfk02F8o2EodYJumG"
}

Мой код POJO следующий:

User.class

public class User {

    @SerializedName("userData")
    @Expose
    private UserData userData;

    @SerializedName("token")
    @Expose
    private String token;

    ... CONSTRUCTOR AND GETTERS/SETTERS

}

UserData.class

public class UserData {

    @SerializedName("username")
    @Expose
    private String username;

    @SerializedName("email")
    @Expose
    private String email;

    @SerializedName("createdAt")
    @Expose
    private String createdAt;

    @SerializedName("updatedAt")
    @Expose
    private String updatedAt;

    @SerializedName("id")
    @Expose
    private String id;

    ... CONSTRUCTOR AND GETTERS/SETTERS

}

Я скопировал из другого поста следующий класс для десериализации GSON. Код является:

RestDeserializer.class

public class RestDeserializer<T> implements JsonDeserializer<T> {

    private Class<T> mClass;
    private String mKey;

    public RestDeserializer(Class<T> targetClass, String key) {
        mClass = targetClass;
        mKey = key;
    }

    @Override
    public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
            throws JsonParseException {
        JsonElement content = je.getAsJsonObject().get(mKey);
        return new Gson().fromJson(content, mClass);

    }
}

Реализованная реализация:

RetroFitImpl

public class UserApiImpl implements UserApi {

    @Inject
    public UserApiImpl() { }

    @Override
    public User loginUser(String identifier, String password) {
        Retrofit retrofitBuilder = getRetrofitBuilder();
        UserRetrofitApi userRetrofitApi = retrofitBuilder.create(UserRetrofitApi.class);

        LoginRequestEntity loginRequestEntity = new LoginRequestEntity();
        loginRequestEntity.setIdentifier(identifier);
        loginRequestEntity.setPassword(password);

        Call<User> call = userRetrofitApi.loginUser(loginRequestEntity);
        Response<User> response = null;
        try {
            response = call.execute();
        } catch (IOException e) {
            e.printStackTrace();
        }

        User body = null;
        if (response != null) {
            body = response.body();
        }
        return body;
    }

    private Retrofit getRetrofitBuilder() {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

        return new Retrofit.Builder()
                .baseUrl(BuildConfig.API_URL)
                .client(client)
                .addConverterFactory(buildGsonConverter())
                .build();
    }

    private static GsonConverterFactory buildGsonConverter() {
        GsonBuilder gsonBuilder = new GsonBuilder();

        Gson gson = new GsonBuilder()
                .registerTypeAdapter(User.class, new RestDeserializer<>(User.class, "userData"))
                .create();

        return GsonConverterFactory.create(gson);
    }
}

Я делаю что-то не так с методом buildGsonConverter, потому что каждый раз мне звонят в onError, и я думаю, что это проблема при создании GSON.

Кто-нибудь может сказать мне, как разобрать это, чтобы построить GSON, как ответ сервера?

Спасибо.

2 ответа

Вам не нужно создавать Pojo самостоятельно. Вы можете использовать http://jsonschema2pojo.com/ для создания ответа сервера pojo US ng yur.

Проверьте пример из модифицированной документации

http://square.github.io/retrofit/

Вам не нужно создавать собственную фабрику GSON

.addConverterFactory(GsonConverterFactory.create())

А также добавить в build.gradle

com.squareup.retrofit2:converter-gson
Другие вопросы по тегам