#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. Спасибо! я обнаружил сам раньше, но спасибо за решение!