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?
3 Réponses :
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. ... :)
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 ());
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; } }
Toutes les étapes à vérifier:
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; }
votre code attend un seul
modèle
comme réponse, à la place vous obtenez un objet, qui a unrésultats
tableau demodè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 .