簡體   English   中英

Retrofit返回空值

[英]Retrofit returns null values

我正在使用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響應,因為它有一個優秀的實例,但我不知道如何在代碼中使用它。

我沒有得到回復,這一切都正確嗎?

問題是JSON解析器不期望在JSON中包裝“movie”數據的未命名根對象。

如果您可以更改服務器返回的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

您的String名稱區分它們在JSON輸出中的顯示方式。 String Id to String id更改String Id to String id並且它應該工作,它在getter和setter名稱中無關緊要(例如getId ),但變量本身需要與JSON中的大小寫匹配。

將電影模型更改為:

public class Movie { 

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

    public String getId() {
        return Id;
    } 

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

Gson需要確切知道如何通過反射來映射模型。 如果你不另外說明,它主要使用你的變量名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM