我在Android中使用Retrofit来发送请求并接收响应,但是当我想要转换来自服务器的响应时总是遇到问题Exception:
Exception
retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING
当服务器的响应应该给我电影列表时,我需要将所有这些电影都放在列表中。
Movie (型号类别):
Movie
public class Movie { public Movie() {} @SerializedName("original_title") private String movieTitle; @SerializedName("vote_average") private String movieVoteAverage; @SerializedName("overview") private String movieOverview; ............ }
GitMovieApi 类:
GitMovieApi
public interface GitMovieApi { @GET("/3/movie/{movie}") public void getMovie(@Path("movie") String typeMovie,@Query("api_key") String keyApi, Callback<Movie> response); }
RestAdapter 组态:
RestAdapter
RestAdapter restAdapter = new RestAdapter.Builder() .setLogLevel(RestAdapter.LogLevel.FULL) .setConverter(new GsonConverter(new GsonBuilder().registerTypeAdapter(Movie.class, new UserDeserializer()).create())) .setEndpoint("http://api.themoviedb.org") .build(); GitMovieApi git = restAdapter.create(GitMovieApi.class); git.getMovie("popular", "Keyapi", new Callback<Movie>() { @Override public void success(Movie movie, Response response) { Toast.makeText(getActivity(), "s", Toast.LENGTH_LONG).show(); } @Override public void failure(RetrofitError error) { Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_LONG).show(); } });
UserDeserializer:
public class UserDeserializer implements JsonDeserializer<Movie> { @Override public Movie deserialize(JsonElement jsonElement, Type typeOF, JsonDeserializationContext context) throws JsonParseException { JsonElement userJson = new JsonParser().parse("results"); return new Gson().fromJson(userJson, Movie.class); } }
杰森(回应):
{ "page": 1, "results": [ { "adult": false, "backdrop_path": "/tbhdm8UJAb4ViCTsulYFL3lxMCd.jpg", "genre_ids": [ 53, 28, 12 ], "id": 76341, "original_language": "en", "original_title": "Mad Max: Fury Road", "overview": "An apocalyptic story set in the furthest.", "release_date": "2015-05-15", "poster_path": "/kqjL17yufvn9OVLyXYpvtyrFfak.jpg", "popularity": 48.399601, "title": "Mad Max: Fury Road", "video": false, "vote_average": 7.6, "vote_count": 2114 }, { "adult": false, "backdrop_path": "/sLbXneTErDvS3HIjqRWQJPiZ4Ci.jpg", "genre_ids": [ 10751, 16, 12, 35 ], "id": 211672, "original_language": "en", "original_title": "Minions", "overview": "Minions Stuart.", "release_date": "2015-06-25", "poster_path": "/s5uMY8ooGRZOL0oe4sIvnlTsYQO.jpg", "popularity": 31.272707, "title": "Minions", "video": false, "vote_average": 6.8, "vote_count": 1206 }, ], "total_pages": 11871, "total_results": 237415 }
UserDeserializer完全摆脱它,这是不需要的。您的查询返回的是电影列表,因此请对实际读取电影列表的对象进行回调:
UserDeserializer
public class MovieList { @SerializedName("results") List<Movie> movieList; // you can also add page, total_pages, and total_results here if you want }
那么您的GitMovieApi课程将是:
public interface GitMovieApi { @GET("/3/movie/{movie}") public void getMovie(@Path("movie") String typeMovie, @Query("api_key") String keyApi, Callback<MovieList> response); }
您的RestAdapter:
RestAdapter restAdapter = new RestAdapter.Builder() .setLogLevel(RestAdapter.LogLevel.FULL) .setConverter(new GsonConverter(new GsonBuilder()).create())) .setEndpoint("http://api.themoviedb.org") .build(); GitMovieApi git = restAdapter.create(GitMovieApi.class);
这个问题是 不是 你写的Deserializer不正确的(虽然,你有,但没关系,因为你不需要它,JsonParser是 不是 你如何做到这一点),但是默认的反序列化行为,应该只是罚款你。使用上面的代码,它将正常工作。
Deserializer
JsonParser