Retrofit返回空值

3

我正在使用Retrofit,但在Android方面还是个新手。

这是我的JSON响应:

    {
    "movie": {
        "_id": "568661682d33bca267fdf81b",
        "poster_path": "https://image.tmdb.org/t/p/w154/xHfhQIK4BNlsGv5Ylx8mVq0hJT1.jpg",
        "adult": false,
        "overview": "",
        "release_date": "2015-05-15",
        "id": 76341,
        "original_title": "Mad Max: Fury Road",
        "original_language": "en",
        "title": "Mad Max: Furia en la carretera",
        "vote_count": 3105,
        "__v": 0,
        "popular": true,
        "production_companies": [],
        "cast": [],
        "genre_ids": [
            53,
            28,
            12
        ]
    }
}

这是我的电影模型:
public class Movie {

public String Id;
//more variables

public String getId() {
    return Id;
}

public void setId(String id) {
    Id = id;
}
//more getter and setter

我的Retrofit接口

public interface MyApiEndPointsInterface {
  @GET("/movie/{id}")
  Call<Movie> getMovie(@Path("id") int id);
}

在活动中的代码:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    MyApiEndPointsInterface apiService =
            retrofit.create(MyApiEndPointsInterface.class);

    Call<Movie> call = apiService.getMovie(76341);

    call.enqueue(new Callback<Movie>() {
        @Override
        public void onResponse(Response<Movie> response, Retrofit retrofit) {
            Log.d("MainActivity", response.body().title);
        }

        @Override
        public void onFailure(Throwable t) {

        }
    });

我认为这可能是JSON响应,因为它有一个优秀的例子,但我不知道如何在代码中使用它。
我没有收到响应,这一切都正确吗?
3个回答

5
问题在于JSON解析器没有预期JSON中包装“电影”数据的未命名根对象。
如果您可以更改服务器返回的JSON,请删除外部对象,这样您只需要
{
    "_id": "568661682d33bca267fdf81b",
    "poster_path": "https://image.tmdb.org/t/p/w154/xHfhQIK4BNlsGv5Ylx8mVq0hJT1.jpg",
    "adult": false,
    "overview": "",
    "release_date": "2015-05-15",
    "id": 76341,
    "original_title": "Mad Max: Fury Road",
    "original_language": "en",
    "title": "Mad Max: Furia en la carretera",
    "vote_count": 3105,
    "__v": 0,
    "popular": true,
    "production_companies": [],
    "cast": [],
    "genre_ids": [
        53,
        28,
        12
    ]
}

如果您无法更改服务器的响应,则有几种处理客户端的方法。我会简单地创建另一个对象来映射到外部JSON对象,因此保留现有的Movie类不变,添加如下内容:

public class MovieResponse {
 public Movie movie;
}

然后将Retrofit调用更改为使用MovieResponse而不是Movie。然后您可以引用

movieResponse.movie

我通过更改API解决了这个问题,它是JSON的第一个属性,非常感谢 :) - David Luque

2

您的字符串名称在JSON输出中区分大小写。将 String Id 改为 String id,它就可以正常工作了。在 getter 和 setter 名称中不重要(例如 getId),但变量本身需要与 JSON 中的大小写匹配。


1
将电影模型更改为:
public class Movie { 

    @SerializedName("_id")
    public String id;
    //more variables 

    public String getId() {
        return Id;
    } 

    public void setId(String id) {
        id = id;
    }
}

Gson需要通过反射准确地了解如何映射您的模型。如果没有另外说明,它主要使用您的变量名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接