当前位置: 首页 > 面试题库 >

如何在翻新库中使用Gson?

姜楷
2023-03-14
问题内容

我在Android中使用Retrofit来发送请求并接收响应,但是当我想要转换来自服务器的响应时总是遇到问题Exception

retrofit.RetrofitError: com.google.gson.JsonSyntaxException: 
               java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING

当服务器的响应应该给我电影列表时,我需要将所有这些电影都放在列表中。

Movie (型号类别):

public class Movie {
    public Movie() {}
    @SerializedName("original_title")
    private String movieTitle;
    @SerializedName("vote_average")
    private String movieVoteAverage;
    @SerializedName("overview")
    private String movieOverview;
    ............  
}

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 = 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完全摆脱它,这是不需要的。您的查询返回的是电影列表,因此请对实际读取电影列表的对象进行回调:

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不是
你如何做到这一点),但是默认的反序列化行为,应该只是罚款你。使用上面的代码,它将正常工作。



 类似资料:
  • 问题内容: 我在我的应用程序中使用Retrofit库,我想将超时设置为60秒。改装有某种方法可以做到这一点吗? 我以这种方式设置Retrofit: 如何设置超时时间? 问题答案: 您可以在基础HTTP客户端上设置超时。如果未指定客户端,则Retrofit将使用默认的连接和读取超时创建一个客户端。要设置自己的超时时间,您需要配置自己的客户端并将其提供给。 一种选择是使用也是来自Square 的OkH

  • 问题内容: 我正在使用改造高效的网络库,但无法处理包含单个前缀的Dynamic JSON,该前缀 会随机更改,在某些情况下(动态),相同的前缀()会更改为String。 Json格式的responseMessage对象: Json格式会动态更改为字符串类型: 我的问题是,由于改造具有内置的解析,我必须为每个请求分配单个POJO!但是不幸的是,REST-API是基于动态响应构建的。前缀将在 成功(…

  • 问题内容: 我需要使用Retrofit 2发布JSON对象。我的JSON对象是 {“ logTime”:“”,“ datas”:[{“ dat1”:“ 1”,“ dat2”:“”,“ dat3”:“”,“ dat4”:“”,“ dat5”:“” } ,{“ dat1”:“ 1”,“ dat2”:“”,“ dat3”:“”,“ dat4”:“”,“ dat5”:“” }]} 我尝试使用以下代码: A

  • 我尝试使用< code >翻新发送音频文件,但是< code>ResponseBody总是为空,状态为< code>500内部服务器错误,我尝试了许多不同的方法,但是没有任何效果 邮递员截图: 身体 标题 我的客户: addAudioComment方法: 请求:

  • 我不是在问AffineTransform是如何工作的,而是如何使用它的翻译方法。 我多次阅读API,但仍然不明白它是如何工作的。 公共空转换(双tx,双ty) 将此转换与翻译转换连接起来。这相当于调用concatenate(T),其中T是由以下矩阵表示的AffineTransform: 问题:

  • 问题内容: 我正在制作一个用于语言实时翻译的android应用…我使用了识别器意图从用户那里获取语音输入,然后它给出了用户所说的选项列表。现在我想使用google将其翻译为另一种语言翻译api,但我不知道如何使用它。到目前为止,我所做的代码是。此外,如果您能告诉我如何做到这一点,而不是给我我所说的内容的选择,它会自行选择一个,然后在此上使用google translation api…。 问题答案