Здравствуйте.
Разрабатываю rest приложение на Android. Использую Retrofit + Gson + RxJava.
С сервера приходят ответы такого типа:
{"error":false,"json":true,"body":{...JSON object...}}
Необходимо всегда парсить то, что находится в body.
Попробовал создать свою TypeAdapterFactory и вот что получилось:
public class ItemTypeAdapterFactory implements TypeAdapterFactory {
public static final String BODY = "body";
@Override
public <T> TypeAdapter<T> create(Gson gson, final TypeToken<T> type) {
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
return new TypeAdapter<T>() {
public void write(JsonWriter out, T value) throws IOException {
delegate.write(out, value);
Logger.d(this, "dami");
}
public T read(JsonReader in) throws IOException {
JsonElement jsonElement = elementAdapter.read(in);
if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has(BODY) && jsonObject.get(BODY).isJsonObject()) {
jsonElement = jsonObject.get(BODY);
}
}
return delegate.fromJsonTree(jsonElement);
}
}.nullSafe();
}
Далее используем это в создании сервиса retrofit:
public abstract class AbstractApiService {
private RestAdapter restAdapter;
public AbstractApiService() {
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(new ItemTypeAdapterFactory())
.create();
restAdapter = new RestAdapter.Builder()
.setEndpoint(ApiConf.API_URL)
.setConverter(new GsonConverter(gson))
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
}
protected <T> T create(Class<T> service) {
return restAdapter.create(service);
}
}
Результат таков, что оно ни разу даже не попадает в метод create у ItemTypeAdapterFactory и судя по всему Gson так и продолжает юзать свою стандартную реализацию.
Помогите, пожалуйста.