Handle inconsistent API response with Retrofit Handle inconsistent API response with Retrofit json json

Handle inconsistent API response with Retrofit


Try to do by using TypeAdapterFactory. Sample of that class as shown below.

public class ItemTypeAdapterFactory implements TypeAdapterFactory {    @Override    public <T> TypeAdapter<T> create(Gson gson, 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);            }            public T read(JsonReader in) throws IOException {                JsonElement jsonElement = elementAdapter.read(in);                if (jsonElement.isJsonObject()) {                    JsonObject jsonObject = jsonElement.getAsJsonObject();                    if (jsonObject.has("data") && jsonObject.get("data").isJsonObject()) {                        jsonElement = jsonObject.get("data");                    }                }                return delegate.fromJsonTree(jsonElement);            }        }.nullSafe();    }}

And this Gson into RestAdapter

final Gson gson = new GsonBuilder().registerTypeAdapterFactory(new ItemTypeAdapterFactory()).create();final Client client = new OkClient(new OkHttpClient());final RestAdapter restAdapter = new RestAdapter.Builder().setClient(client).setLogLevel(RestAdapter.LogLevel.FULL).setConverter(new GsonConverter(gson)).setEndpoint(context.getString(R.string.base_url)).build();