Проблемы со списками и использованием Retrofit2 и gson converter в java android studio

#android #gson #retrofit2

#Android #gson #retrofit2

Вопрос:

Я пытаюсь вызвать свой серверный сервер с помощью retrofit, чтобы получить список тем форума для приложения andorid.

Я проверил URL-адрес запроса, и он правильный, но когда я пытаюсь получить содержимое ответа, я получаю пустой список. Я связался с postman и получаю желаемый результат в следующем формате:

  "gaiaIkustekoJSON": [
        {
            "idGaia": 1,
            "fecha": "2020/11/19 19:52:16",
            "grupo": "student",
            "texto": "Arazoak problemekin;Nahiko larri nabil problemak ebazteko ariketetan, nonork metodoren bat azaldu ahal dit?",
            "alias": "Prueba0"
        }]
 

Моя структура Android следующая:

Установка дооснащения:

  this.login = login;
        this.passwd=passwd;

        Gson gson = new GsonBuilder()
                .create();

        OkHttpClient authClient = new OkHttpClient().newBuilder().addInterceptor(chain -> {
            Request originalRequest = chain.request();
            Request.Builder builder = originalRequest.newBuilder()
                    .header("Authorization", Credentials.basic(login, passwd));

            Request newRequest = builder.build();
            return chain.proceed(newRequest);
        }).build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(authClient)
                .build();

        api = retrofit.create(EhuApi.class);
       // Log.d("pruebaretrofit", "se instancia bien la interfaz");
        Log.d("pruebaretrofit", login "/" passwd);
 

Функция вызова API:

 return api.getGaiak("student").execute().body() ;
 

Получение ответа на вызов API:

 Gaiak gaia=activity.backend.getGaiak();
 

И используемый ранее компонент имеет следующую структуру:

 public class Gaiak {
    private List<Gai> gaiak;
    public Gaiak(){
        this.gaiak=new ArrayList<Gai>();
    }
    public Gaiak(List<Gai> gaiak){
        super();
        this.gaiak=gaiak;
    }

    public List<Gai> getGaiak() {
        return gaiak;
    }

    public void setGaiak(List<Gai> gaiak) {
        this.gaiak = gaiak;
    }
}

 

бобы, из которых сформирован список:

 public class Gai {
    private int idGaia;
    private String fecha;
    private String grupo;
    private String texto;
    private String alias;
    public Gai(){

    }
    public Gai(int idGaia, String fecha, String grupo, String texto, String alias) {
        super();
        this.idGaia = idGaia;
        this.fecha = fecha;
        this.grupo = grupo;
        this.texto = texto;
        this.alias = alias;
    }
    public String getFecha() {
        return fecha;
    }

    public void setFecha(String fecha) {
        this.fecha = fecha;
    }

    public String getGrupo() {
        return grupo;
    }

    public void setGrupo(String grupo) {
        this.grupo = grupo;
    }

    public String getTexto() {
        return texto;
    }

    public void setTexto(String texto) {
        this.texto = texto;
    }

    public int getIdGaia() {
        return idGaia;
    }

    public void setIdGaia(int idGaia) {
        this.idGaia = idGaia;
    }

    public String getAlias() {
        return alias;
    }

    public void setAlias(String alias) {
        this.alias = alias;
    }
}

 

Пожалуйста, мне действительно нужна помощь, кто-нибудь может мне помочь?

Спасибо!!

Комментарии:

1. добавьте перехватчик ведения журнала, чтобы проверить, правильно ли вы выполняете запрос github.com/square/okhttp/tree/master/okhttp-logging-interceptor

2. Извините, как я уже сказал, я проверил правильность запроса, и я проверил, что ответ вернул мне 200 OK

Ответ №1:

GsonConverterFactory пытается сопоставить json данные с вашими POJO , используя имя общедоступных свойств в классе или общедоступном получателе, и помещает правильные данные в правильное свойство, используя отражение. когда он не находит правильное свойство, результат просто игнорируется. даже если вы сделаете успешный запрос и получите результат, он просто затеряется в земле ниоткуда.

Итак, в вашем случае результат игнорируется, потому что в json названии списка есть gaiaIkustekoJSON , а в вашем POJO имени есть gaiak , поэтому он не может сопоставить и поместить данные списка gaiaIkustekoJSON , gaiak потому что имя не совпадает. теперь вы можете сделать три вещи

1. измените название списка с gaiak на gaiaIkustekoJSON

2. измените имя получателя на setGaiaIkustekoJSON

3. поставьте @SerializedName("gaiaIkustekoJSON") выше private List<Gai> gaiak;

и хорошего вам дня

Комментарии:

1. Спасибо! я обнаружил сам раньше, но спасибо за решение!