RoboSpice + Google HTTP Client + GSON = не удалось проанализировать JSON для объекта

Я использую RoboSpice с Google HTTP Client и GSON следующим образом:

ApiSpiceService:

public class ApiSpiceService extends GoogleHttpClientSpiceService {

    private static final int THREAD_COUNT = 3;

    @Override
    public CacheManager createCacheManager(Application application) throws CacheCreationException {
        CacheManager cacheManager = new CacheManager();

        GsonObjectPersisterFactory gsonObjectPersisterFactory = new GsonObjectPersisterFactory(application);
        cacheManager.addPersister(gsonObjectPersisterFactory);


        return cacheManager;
    }

    @Override
    public int getThreadCount() {
        return THREAD_COUNT;
    }
}

Запрос:

public class InfoRequest extends GoogleHttpClientSpiceRequest<Contact> {

    private final String url;

    public InfoRequest() {
        super(Contact.class);

        this.url = "some-url/path.json";
    }

    @Override
    public Contact loadDataFromNetwork() throws Exception {
        HttpTransport httpTransport = new NetHttpTransport();
        HttpRequestFactory httpRequestFactory = httpTransport.createRequestFactory(new InfoHttpRequestInitializer());
        HttpRequest httpRequest = httpRequestFactory.buildGetRequest(new GenericUrl(url));
        httpRequest.setParser(new GsonFactory().createJsonObjectParser());

        return httpRequest.execute().parseAs(Contact.class);
    }

    private class InfoHttpRequestInitializer implements HttpRequestInitializer {

        @Override
        public void initialize(HttpRequest request) throws IOException {
        }
    }
}

Модель (Contact.java):

public class Contact {
    private String data;
}

BaseActivity:

public abstract class BaseActivity extends ActionBarActivity {

    protected SpiceManager spiceManager = new SpiceManager(ApiSpiceService.class);


    @Override
    protected void onStart() {
        super.onStart();

        spiceManager.start(this);
    }

    @Override
    protected void onStop() {
        spiceManager.shouldStop();

        super.onStop();
    }
}

И MainActivity:

public class MainActivity extends BaseActivity {
   private InfoRequest infoRequest;

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        infoRequest = new InfoRequest();
    }

    @Override
    protected void onStart() {
        super.onStart();

        spiceManager.execute(infoRequest, "txt", DurationInMillis.ALWAYS_EXPIRED, new TextRequestListener());
    }

private class TextRequestListener implements RequestListener<Contact> {

        @Override
        public void onRequestFailure(SpiceException spiceException) {
           //
        }

        @Override
        public void onRequestSuccess(Contact s) {
            //
        }
    }

Кажется, это допустимый код, но, к сожалению, когда он завершит выполнение запроса, данные поля в возвращенном экземпляре Contact будут нулевыми. В logcat нет ошибок.

Запрашиваемый контент на 100% действителен в формате JSON. Почему это не анализируется?

1 ответ

Решение

Хорошо, я нашел решение. Мне нужно добавить аннотацию @Key к полям в модели. Это странно, потому что чистый Гсон этого не требует.

public class Contact {

    @Key
    private String data;

}
Другие вопросы по тегам