2015-04-04 3 views
1

Я использую RoboSpice с Google HTTP Client & GSON таким образом:RoboSpice + Клиентские Google HTTP + GSON = не удалось разобрать JSON объекта

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) { 
      // 
     } 
    } 

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

Запрошенному контенту на 100% соответствует JSON. Почему он не разбирается?

ответ

1

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

Смежные вопросы