[android]改造请求返回 null 为特定的数据模型

标签: Java Android
发布时间: 2017/3/19 19:21:22
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图使一个 API 请求到Imgur API应该返回下面的数据模型︰

"data": [{
        "id": "CiDkx",
        "title": "Did You Know",
        [...]                     
    } [...]
    ],
"success": true,
"status": 200
}

但我不明白如何去实现它。

到目前为止在这里是如何,我试着这样做︰

public interface ImgurAPI {
    @GET("gallery/hot/viral/{page}")
    Call<ImageData> getGallery(@Path("page") String page); 
}

static final String BASE_URL = "https://api.imgur.com/3/";

public void start() {
    Gson gson = new GsonBuilder()
            .setLenient()
            .create();

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

    ImgurAPI githubAPI = retrofit.create(ImgurAPI.class);

    Call<ImageData> call = githubAPI.getGallery("0");
    call.enqueue(this);
}

@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onResponse(Call<ImageData> call, Response<ImageData> response) {
    if(response.isSuccessful()) {
        ImageData image = response.body();
    } else {
        System.out.println(response.errorBody());
    }
}

其中 ImageData 是一个容器类,像这样︰

public class ImageData {
    public String id;
    public String title;

    public String getId() {
        return id;
    }

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

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

请求并去但我收到的响应有一个 id 和一个标题,是 null

我几乎可以肯定的是,我不明白如何组织我的模型 (或者我应该说容器?) 类,我在这个意义上说对吗?

解决方法 1:

你对此非常接近,我推荐调试或添加一些改造的日志记录不搞得清楚。

没有进一步看到信息看起来您的图像数据类不匹配您使用 JSON。看看https://api.imgur.com/3/gallery/hot/viral/0.json ...

{
"data": [{
    "id": "CiDkx",
    "title": "Did You Know",
    "description": null,
    "datetime": 1487140997,
    "cover": "yZXOBMq",
    ...
}]

}

开始与您正在使用的此类对象,是未命名的数组指定的"数据"和包含进一步对象与每个图像的信息,如 ID 和标题。

您的图像数据类是图像数据项目之一,它不是改造和 GSON 得到,试图解析的集合。你需要一类的集合或进一步注释。试着这样的事情......

    public class ImageDataCollection {

       @SerializedName("data")
       private List<ImageData> imageDataList;

       public List<ImageData> getImageDataList() {
          return imageDataList;
       }

       public void setImageDataList(List<ImageData> imageDataList) {
          this.imageDataList = imageDataList;
       }  
    }

然后处理该集合包装,而不是单一的图像数据对象你 ImgUr 接口。(并请注意,您可以添加成功和状态字段,这样对每个包装的集合外太,如果你想要检查,这可能将是一个好主意)。

官方微信
官方QQ群
31647020