Как парсить сложные json файлы при помощи Gson и TypeAdapterFactory?

Здравствуйте.
Разрабатываю 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 так и продолжает юзать свою стандартную реализацию.
Помогите, пожалуйста.
  • Вопрос задан
  • 2196 просмотров
Пригласить эксперта
Ответы на вопрос 1
@dmolokanov
Если я не ошибаюсь, для того, чтобы парсинг заработал, надо явно указать GSON, какой тип объекта парсить. А иначе он не знает, почему он должен парсить именно указанным парсером. Но я правда не использовал при этом retrofit.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы