Java 如何在改装库中使用Gson?

Java 如何在改装库中使用Gson?,java,android,json,gson,retrofit,Java,Android,Json,Gson,Retrofit,我在android中使用了发送请求和接收响应的改装,但当我想要转换来自服务器的响应时出现问题,它总是给我异常: retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING 当来自服务器的响应应该给我电影列表,所以我需要把所有这些电影在列表中 电影(模型级): Gi

我在android中使用了发送请求和接收响应的改装,但当我想要转换来自服务器的响应时出现问题,它总是给我
异常

retrofit.RetrofitError: com.google.gson.JsonSyntaxException: 
               java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING
当来自服务器的响应应该给我电影列表,所以我需要把所有这些电影在列表中

电影
(模型级):

GitMovieApi
Class:

public interface GitMovieApi {
    @GET("/3/movie/{movie}")  
    public void getMovie(@Path("movie") String typeMovie,@Query("api_key") String  keyApi, Callback<Movie> response);    
}
用户反序列化程序:

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
,不需要它。您的查询将返回电影列表,因此请回调实际读取电影列表的对象:

public class MovieList {
    @SerializedName("results")
    List<Movie> movieList;
    // you can also add page, total_pages, and total_results here if you want
}
您的
重新适应程序

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

问题不在于您编写的
反序列化程序
不正确(虽然您编写了,但这没关系,因为您不需要它,
JsonParser
不是如何编写的),但是默认的反序列化行为对您来说应该可以正常工作。使用上述代码,它就可以正常工作。

在改装2中,它更简单。您的
GitMovieApi
课程:

interface MoviesApi {
    @GET("/3/movie/{movie}")
    Call<MovieList> getMovies(@Path("movie") String typeMovie,
                              @Query("api_key") String keyApi);
}
interface MoviesApi{
@获取(“/3/movie/{movie}”)
调用getMovies(@Path(“movie”)字符串类型movie,
@查询(“api_键”)字符串keyApi);
}
然后,您只需创建一个改装对象并进行回调:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(MOVIES_BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
service = retrofit.create(MoviesApi.class);

Call<MovieList> mlc = service.getMovies(getArguments().getString(ARG_MOVIE_TYPE), getString(R.string.THE_MOVIE_DB_API_TOKEN));
mlc.enqueue(new Callback<MovieList>() {
        @Override
        public void onResponse(Call<MovieList> call, Response<MovieList> response) {
            movies = response.body().movieList;
        }

        @Override
        public void onFailure(Call<MovieList> call, Throwable t) {}
});
reformation-reformation=new-reformation.Builder()
.baseUrl(电影\u基本\u URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
服务=改装.create(MoviesApi.class);
调用mlc=service.getMovies(getArguments().getString(ARG_MOVIE_类型),getString(R.string.THE_MOVIE_DB_API_令牌));
排队(新回调(){
@凌驾
公共void onResponse(调用、响应){
movies=response.body().movieList;
}
@凌驾
public void onFailure(Call,Throwable t){}
});

results的内容不是电影。这是一个电影列表
newjsonparser()。解析(“结果”)
它不是这样工作的。这正试图解析字符串形式的
“结果”
。您想使用提供给您的JsonElement。我知道结果是电影列表,但当您看到Gson时,您可以看到它是一个对象,我尝试获取该对象{…},然后访问电影列表。
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); 
interface MoviesApi {
    @GET("/3/movie/{movie}")
    Call<MovieList> getMovies(@Path("movie") String typeMovie,
                              @Query("api_key") String keyApi);
}
Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(MOVIES_BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
service = retrofit.create(MoviesApi.class);

Call<MovieList> mlc = service.getMovies(getArguments().getString(ARG_MOVIE_TYPE), getString(R.string.THE_MOVIE_DB_API_TOKEN));
mlc.enqueue(new Callback<MovieList>() {
        @Override
        public void onResponse(Call<MovieList> call, Response<MovieList> response) {
            movies = response.body().movieList;
        }

        @Override
        public void onFailure(Call<MovieList> call, Throwable t) {}
});