Как использовать 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