Не понимаю как именно Retrofit парсит json с GSON и как с этим работать?
При созднии объекта Retrofit Вы добавили конвертер для десериализации приходящих данных (в данном случае Gson). Этот конвертер реализуется через GsonConverterFactory.
.addConverterFactory(GsonConverterFactory.create())
В интерфейсе API Вы указали тип приходящих данных, завёрнутый в объект вызова Retrofit (Call):

Call<List<MyModel>> getData();

В итоге в метод onResponse() придёт List уже распарсенных данных (MyModel). Именно конвертер, который вы указали (Gson), по приходу данных десереализовал их в объекты того типа, которого Вы указали в интерфейсе API.
Здравствуйте!
Скидываю вам пример кода, в данном случае я использую Retrofit c Jackson (вместо GSON)

public interface LfkServerAPI {
    @GET("rest/categories/list")
    Call<List<CategoryDTO>> getAllCategories();
}

@Data
public class Category {
private Long categoryId;

    private String categoryName;

    private String categoryDescription;

}

@Getter
@Setter
public class CategoryDTO {

    private Long categoryId;

    private String categoryName;

    private String categoryDescription;

}

public class ApiClient {

    public static Retrofit retrofit = null;

    public static Retrofit getApiClient() {

        if (retrofit == null) {

            retrofit = new Retrofit.Builder()
                    .baseUrl(Constants.BASE_URL)
                    .addConverterFactory(JacksonConverterFactory.create())
                    .build();

        }
        return retrofit;

    }

}

Обратите внимание на этот участок кода:
LfkServerAPI lfkServerAPI = ApiClient.getApiClient().create(LfkServerAPI.class);
Call<List<CategoryDTO>> allCategoriesListCall = lfkServerAPI.getAllCategories();

allCategoriesListCall.enqueue(new Callback<List<CategoryDTO>>() {
    @Override
    public void onResponse(Call<List<CategoryDTO>> call, Response<List<CategoryDTO>> response) {

        if (!response.isSuccessful()) {
            Log.d(LOG, "Ответ сервера: " + response.code());
            return;
        }

        // Вызываем метод body() из полученного ответа, где будет наш pojo
        List<CategoryDTO> categoryDTOS = response.body();

        if (categoryDTOS != null) {

        	categoryDTOS.forEach(categoryDTO -> {
				Category category = new Category();	
                category.setCategoryId(categoryDTO.getCategoryId());
                category.setCategoryName(categoryDTO.getCategoryName());
                category.setCategoryDescription(categoryDTO.getCategoryDescription());
                category.save();
        	});

        }
    }

    @Override
    public void onFailure(Call<List<CategoryDTO>> call, Throwable throwable) {
        Log.d(LOG, throwable.getMessage());
    }
});