2

i have a problem with Retrofit call. I'd wanted to get some data, just for testing purposes, to see if anything come, but as you can see, nothing comes. I've getting data like 0, 0.0, null.

Json response

    {
  "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"
    }
  ]
}

Interface call

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

Retrofit call

    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) {

        }
    });
}

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;
}

What should I change in the code? I will appreciate every hint. The code that I've received from the call is 200 - so call is succesfull, is there something with my pojo class?

*Edited POJO

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;
 }
}

edited retrofit call

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());
            }
        }

Here's the part, what I've received.

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

Why doesn't it get properly names?

  • your code expects a single `model` as response, instead you are getting an object, which has `results` array of `model` – Vladyslav Matviienko Jun 10 '19 at 05:14
  • Can you please edit and put your full pojo class? – Shubham Sejpal Jun 10 '19 at 05:15
  • you haven't put "API KEY" in interface "@GET("3/discover/movie?api_key=APIKEY&with_genres=27")" – jay shah Jun 10 '19 at 05:16
  • the json has a parent above your "model" (the ones that contains page, total result, etc.) your model class is actually a list inside this missing parent class. you can try auto generating the model classes using http://www.jsonschema2pojo.org/. – Angel Koh Jun 10 '19 at 05:21

3 Answers3

0

Your Model class should look like the following:

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
}

Then the retrofit call should be like this:

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) {

        }
    });

Happy coding.... :)

rawcoder064
  • 1,374
  • 3
  • 11
  • 26
  • I've make the similar way, before your post, but output is same, it doesn't get properly names. See my edited question. –  Jun 10 '19 at 05:48
  • From your edited question, you are printing object. Try to print like this: System.out.println(response.body().getResults().get(0).getVoteCount()); – rawcoder064 Jun 10 '19 at 06:14
0

use this site to generate a correct response class in java

response class will look like this :

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;
}

}
Mohammad Sommakia
  • 1,773
  • 3
  • 15
  • 48
0

All the steps that you should check:

  1. call your api in postman or each browser to get and check response json
  2. copy your json response (that you expected) into http://www.jsonschema2pojo.org/ this site to get POJO of that
  3. brake your api address in base URL and endpoint and create retrofit request
  4. in onResponse block of retrofit request callback if you expected get json Object so call this metod

java

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;
    }

kotlin

 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
        }

5.in onResponse block of retrofit request callback if you expected get json Array so call this metod

java

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;
    }

kotlin

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
        }