Как получить поле "cotacaoCompra" внутри Json, используя retrofit2? - PullRequest
0 голосов
/ 28 апреля 2019

Я полный нуб внутри Android.Сейчас я использую Retrofit для запроса поля в API, но этот API сложен для простого запроса.Мне нужно только значение поля с именем "cotacaoCompra", но каждый раз, когда я отправляю запрос, возвращаемое значение равно нулю.Пожалуйста, если вы знаете, как мне помочь, я буду очень признателен.

Ссылка API http://twixar.me/rFNK

Моя базовая модификация

retrofitBrita = new Retrofit.Builder()
        .baseUrl("https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
recuperarMoedasRetrofit();

Мои геттеры и сеттеры

public class Brita {
    private String cotacaoCompra;
    private String cotacaoVenda;
    public String getCotacaoCompra() {
        return cotacaoCompra;
    }
    public void setCotacaoCompra(String cotacaoCompra) {
        this.cotacaoCompra = cotacaoCompra;
    }
    public String getCotacaoVenda() {
        return cotacaoVenda;
    }
    public void setCotacaoVenda(String cotacaoVenda) {
        this.cotacaoVenda = cotacaoVenda;
    }
}

Мой интерфейс

@GET("CotacaoDolarDia(dataCotacao=@dataCotacao)?@dataCotacao='04-26-2019'&$top=1&$format=json&$select=cotacaoCompra,cotacaoVenda,dataHoraCotacao")
    Call<Brita> recuperarBitcoin();

Моя очередь

call.enqueue(new Callback<Brita>() {
             @Override
             public void onResponse(Call<Brita> call, Response<Brita> response) {
                 Brita brita = response.body();
                 if (response.isSuccessful()) {
                     login_login.setText(brita.getCotacaoCompra());
                 }
             }

1 Ответ

0 голосов
/ 02 мая 2019

Когда вы используете Retrofit с Gson, вы обычно копируете json в java-модели. Вы сделали это правильно с Brita, но это просто элемент внутри массива value:

{  
  "cotacaoCompra":3.9347,
  "cotacaoVenda":3.9353,
  "dataHoraCotacao":"2019-04-26 13:11:30.05"
}

(На самом деле, если вы просто заинтересованы в cotacaoCompra, вы можете просто удалить все остальные поля из Brita и просто оставить cotacaoCompra.)

Проблема в том, что Gson попытается десериализовать json, который соответствует Brita, что не так. Ваш json - это объект с полем с именем value, который является массивом Brita объектов. Итак, давайте повторим это в Java POJO:

class BritaResponse {
  @SerializedName("value")
  private List<Brita> value;
  // getters and setters
}

BritaResponse - это объект, который имеет список Brita объектов.

Теперь вы можете определить вызов Retrofit следующим образом:

@GET("CotacaoDolarDia(dataCotacao=@dataCotacao)?@dataCotacao='04-26-2019'&$top=1&$format=json&$select=cotacaoCompra,cotacaoVenda,dataHoraCotacao")
Call<BritaResponse> recuperarBitcoin();

Теперь будет возвращено BritaResponse. Вам потребуется получить доступ к полю value, а затем к первому элементу массива в ответе о модернизации.

Редактировать

Чтобы ответить на ваши комментарии. BritaResponse это новый класс. Чтобы получить доступ к первому элементу, внутри onResponse вам просто нужно сделать что-то вроде:

call.enqueue(new Callback<BritaResponse>() {
         @Override
         public void onResponse(Call<BritaResponse> call, Response<BritaResponse> response) {
             BritaResponse britaResponse = response.body();
             if (response.isSuccessful()) {
                 login_login.setText(
                    britaResponse.getValue().get(0).getCotacaoCompra());
             }
         }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...