2
votes

Je n'ai pas obtenu de données de Retrofit

J'ai un problème avec l'appel de rénovation. Je voulais obtenir des données, juste à des fins de test, pour voir si quelque chose venait, mais comme vous pouvez le voir, rien ne vient. J'ai des données telles que 0, 0.0, null.

Réponse Json

com.example.x.model$movies@5f6763b, 
com.example.x.model$movies@e988158,
com.example.x.model$movies@6812b1,

Appel d'interface

public void onResponse(Call<model> call, Response<model> response) {
            if (!response.isSuccessful()){
            }
            List<model> list = Collections.singletonList(response.body());

            for (model model : list) {
                System.out.println(model.getResults());
            }
        }

Retrofit call

public class model {

@SerializedName("results")
@Expose
private List<movies> results;

public List<movies> getResults() {
    return results;
}

class movies {
    @SerializedName("vote_count")
    @Expose
    private Integer voteCount;
    @SerializedName("vote_average")
    @Expose
    private Double voteAverage;
    @SerializedName("overview")
    @Expose
    private String overview;
 }
}

POJO

public class model {
@SerializedName("vote_count")
private int vote_count;
@SerializedName("vote_average")
private double vote_average;
@SerializedName("overview")
private String overview;

public int getVote_count() {
    return vote_count;
}

public double getVote_average() {
    return vote_average;
}

public String getOverview() {
    return overview;
}

Que dois-je changer dans le code? J'apprécierai chaque indice. Le code que j'ai reçu de l'appel est 200 - donc l'appel est réussi, y a-t-il quelque chose avec ma classe pojo?

* POJO modifié

    String url = "https://api.themoviedb.org/";

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    apiCall api = retrofit.create(apiCall.class);

    Call<model> call = api.getABC();
    call.enqueue(new Callback<model>() {
        @Override
        public void onResponse(Call<model> call, Response<model> response) {
            if (!response.isSuccessful()){
            }
            List<model> list = Collections.singletonList(response.body());

            for (model model : list) {
                String content = "";
                content += model.getVote_count() + "\n";
                content += model.getVote_average() + "\n";
                content += model.getOverview() + "\n\n\n";

                System.out.println(content);
            }
        }

        @Override
        public void onFailure(Call<model> call, Throwable t) {

        }
    });
}

modification de l'appel de mise à niveau

@GET("3/discover/movie?api_key=APIKEY&with_genres=27")
Call<model> getABC();

Voici la partie, ce que j'ai reçu.

    {
  "page": 1,
  "total_results": 1295,
  "total_pages": 65,
  "results": [
    {
      "vote_count": 1669,
      "id": 10515,
      "video": false,
      "vote_average": 8,
      "title": "Castle in the Sky",
      "popularity": 15.853,
      "poster_path": "\/npOnzAbLh6VOIu3naU5QaEcTepo.jpg",
      "original_language": "ja",
      "original_title": "天空の城ラピュタ",
      "genre_ids": [
        12,
        14,
        16,
        28,
        10751,
        10749
      ],
      "backdrop_path": "\/fnMzL4G6HYilH1w1leFXOY5b29m.jpg",
      "adult": false,
      "overview": "A young boy and a girl with a magic crystal must race against pirates and foreign agents in a search for a legendary floating castle.",
      "release_date": "1986-08-02"
    },
    {
      "vote_count": 154,
      "id": 487672,
      "video": false,
      "vote_average": 6.7,
      "title": "Reign of the Supermen",
      "popularity": 15.461,
      "poster_path": "\/e9TzqscNRUaG8HqEP3K1jUvi8pC.jpg",
      "original_language": "en",
      "original_title": "Reign of the Supermen",
      "genre_ids": [
        16,
        28,
        878
      ],
      "backdrop_path": "\/cdCMUHWyXBOsbLL4dOEPdCEtwM4.jpg",
      "adult": false,
      "overview": "In the wake of The Death of Superman, the world is still mourning the loss of the Man of Steel following his fatal battle with the monster Doomsday. However, no sooner as his body been laid to rest than do four new bearers of the Superman shield come forward to take on the mantle. The Last Son of Krypton, Superboy, Steel, and the Cyborg Superman all attempt to fill the vacuum left by the world's greatest champion. Meanwhile, Superman's death has also signaled to the universe that Earth is vulnerable. Can these new Supermen and the rest of the heroes prove them wrong?",
      "release_date": "2019-01-13"
    }
  ]
}

Pourquoi n'y parvient-elle pas correctement les noms?


4 commentaires

votre code attend un seul modèle comme réponse, à la place vous obtenez un objet, qui a un résultats tableau de modèle


Pouvez-vous s'il vous plaît éditer et mettre votre classe de pojo complète?


vous n'avez pas mis "API KEY" dans l'interface "@GET (" 3 / discover / movie? api_key = APIKEY & with_genres = 27 ")"


le json a un parent au-dessus de votre "modèle" (ceux qui contiennent la page, le résultat total, etc.) votre classe de modèle est en fait une liste à l'intérieur de cette classe parent manquante. vous pouvez essayer de générer automatiquement les classes de modèle en utilisant jsonschema2pojo.org .


3 Réponses :


0
votes

Votre classe Model devrait ressembler à ceci:

Call<model> call = api.getABC();
call.enqueue(new Callback<Model>() {
        @Override
        public void onResponse(Call<Model> call, Response<Model> response) {
            if (response.isSuccessful()) {
                List<Result> results=response.body().getResults();
                for(Result result:results){
                Log.d(TAG,"Result: "+result.getVoteCount())                    
               }



            }
        }

        @Override
        public void onFailure(Call<Model> call, Throwable t) {

        }
    });

Ensuite, l'appel de mise à niveau devrait ressembler à ceci:

public class Model {
@SerializedName("page")
private int page;

@SerializedName("results")
private List<Result> results;

@SerializedName("total_results")
private int total;

@SerializedName("total_pages")
private int totalPages;

//.......getter setter methods

}


public class Result{
@SerializedName("vote_count")
private int voteCount;

@SerializedName("vote_average")
private double voteAverage;

@SerializedName("overview")
private String overView;

//.....other fields
//......getter setter methods
}

Bon codage. ... :)


2 commentaires

J'ai fait de la même manière, avant votre publication, mais la sortie est la même, elle n'obtient pas correctement les noms. Voir ma question modifiée.


À partir de votre question modifiée, vous imprimez un objet. Essayez d'imprimer comme ceci: System.out.println (response.body (). GetResults (). Get (0) .getVo‌ teCount ());



0
votes

utilisez ce site pour générer une classe de réponse correcte en java

La classe de réponse ressemblera à ceci: p>

public class BasicResponse implements Serializable
{

@SerializedName("page")
@Expose
private long page;
@SerializedName("total_results")
@Expose
private long totalResults;
@SerializedName("total_pages")
@Expose
private long totalPages;
@SerializedName("results")
@Expose
private List<Result> results = null;
private final static long serialVersionUID = 8749582078961182468L;

public long getPage() {
return page;
}

public void setPage(long page) {
this.page = page;
}

public long getTotalResults() {
return totalResults;
}

public void setTotalResults(long totalResults) {
this.totalResults = totalResults;
}

public long getTotalPages() {
return totalPages;
}

public void setTotalPages(long totalPages) {
this.totalPages = totalPages;
}

public List<Result> getResults() {
return results;
}

public void setResults(List<Result> results) {
this.results = results;
}

}
//-----------------------------------com.example.Result.java--------------

package com.example;

import java.io.Serializable;
import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Result implements Serializable
{

@SerializedName("vote_count")
@Expose
private long voteCount;
@SerializedName("id")
@Expose
private long id;
@SerializedName("video")
@Expose
private boolean video;
@SerializedName("vote_average")
@Expose
private double voteAverage;
@SerializedName("title")
@Expose
private String title;
@SerializedName("popularity")
@Expose
private double popularity;
@SerializedName("poster_path")
@Expose
private String posterPath;
@SerializedName("original_language")
@Expose
private String originalLanguage;
@SerializedName("original_title")
@Expose
private String originalTitle;
@SerializedName("genre_ids")
@Expose
private List<Long> genreIds = null;
@SerializedName("backdrop_path")
@Expose
private String backdropPath;
@SerializedName("adult")
@Expose
private boolean adult;
@SerializedName("overview")
@Expose
private String overview;
@SerializedName("release_date")
@Expose
private String releaseDate;
private final static long serialVersionUID = 2770789699641812364L;

public long getVoteCount() {
return voteCount;
}

public void setVoteCount(long voteCount) {
this.voteCount = voteCount;
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public boolean isVideo() {
return video;
}

public void setVideo(boolean video) {
this.video = video;
}

public double getVoteAverage() {
return voteAverage;
}

public void setVoteAverage(double voteAverage) {
this.voteAverage = voteAverage;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public double getPopularity() {
return popularity;
}

public void setPopularity(double popularity) {
this.popularity = popularity;
}

public String getPosterPath() {
return posterPath;
}

public void setPosterPath(String posterPath) {
this.posterPath = posterPath;
}

public String getOriginalLanguage() {
return originalLanguage;
}

public void setOriginalLanguage(String originalLanguage) {
this.originalLanguage = originalLanguage;
}

public String getOriginalTitle() {
return originalTitle;
}

public void setOriginalTitle(String originalTitle) {
this.originalTitle = originalTitle;
}

public List<Long> getGenreIds() {
return genreIds;
}

public void setGenreIds(List<Long> genreIds) {
this.genreIds = genreIds;
}

public String getBackdropPath() {
return backdropPath;
}

public void setBackdropPath(String backdropPath) {
this.backdropPath = backdropPath;
}

public boolean isAdult() {
return adult;
}

public void setAdult(boolean adult) {
this.adult = adult;
}

public String getOverview() {
return overview;
}

public void setOverview(String overview) {
this.overview = overview;
}

public String getReleaseDate() {
return releaseDate;
}

public void setReleaseDate(String releaseDate) {
this.releaseDate = releaseDate;
}

}


0 commentaires

0
votes

Toutes les étapes à vérifier:

  1. appelez votre API dans Postman ou dans chaque navigateur pour get et check réponse json
  2. copiez votre réponse json (que vous attendiez) dans http: //www.jsonschema2pojo .org / ce site pour en obtenir POJO
  3. freinez votre adresse API dans l ' URL de base et le point de terminaison et créez une demande de mise à niveau
  4. dans onResponse bloc de rappel de demande de mise à niveau si vous vous attendiez à obtenir json Object alors appelez ce metod li>

java

fun getUserPOJOList(value: String) : List<UserPOJO>{
            val gson = Gson()
            val listType = object : TypeToken<List<UserPOJO>>() {}.type
            var data = ArrayList<UserPOJO>()
            try {
                data = gson.fromJson<List<UserPOJO>>(value, listType) as ArrayList<UserPOJO>
            }catch (e: JsonSyntaxException){
                e.printStackTrace()
            }
            return data
        }

kotlin strong>

public static  List<UserPOJO> getUserPOJOList(String value) {
        Gson gson = new Gson();
        Type listType = new TypeToken<List<UserPOJO>>() {}.getType();
        List<UserPOJO> data = new ArrayList<UserPOJO>();
        try {
            data =new ArrayList<UserPOJO>(gson.fromJson(value,listType));
        }catch ( JsonSyntaxException e){
            e.printStackTrace();
        }
        return data;
    }

5.dans onResponse bloc de rappel de demande de mise à niveau si vous vous attendiez à obtenir json Array alors appelez ce metod

java

 fun getUsersPOJO getOUsersPOJOListJs(value: String) : UsersPOJO {
            val gson = Gson()
            val reader = JsonReader(StringReader(value))
            reader.isLenient = true
            var data = UsersPOJO()
            try {
                  data = gson.fromJson<Options>(reader, UsersPOJO::class.java)
            }catch (e: JsonSyntaxException){
                e.printStackTrace()
            }
            return data
        }

kotlin

public static  UsersPOJO getOUsersPOJOJs(String value) {
        Gson gson = new Gson();
        JsonReader reader = new JsonReader(new StringReader(value));
        reader.setLenient(true);
        UsersPOJO data = new UsersPOJO.User();
        try {
            data = gson.fromJson(reader,UsersPOJOr.class);
        }catch ( JsonSyntaxException e){
            e.printStackTrace();
        }
        return data;
    }


0 commentaires