为列表类型

时间:2018-01-26 09:49:38

标签: android retrofit2

我有两个不同的api调用返回不同的pojos -

Call<Verified> verify();

Verified json
-------------
{
  "username":
  "avatar_url":
  "site":
  ...
}
Call<ApiResponse> callapi();

ApiResponse json
----------------
{
  "version":
  "title":
  "url":
  "_meta": {
    "about":
  },
  "items": [
    {
      "id":
      "url":
      "date":
      ...
    },
    ...
  ] 
}

我只想要内部items数据,所以我为它编写了一个自定义的Retrofit包络转换器 -

public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
                                                            Retrofit retrofit) {
        final Converter<ResponseBody, ApiResponse> delegate =
                retrofit.nextResponseBodyConverter(this, ApiResponse.class, annotations);
        return value -> {
            ApiResponse envelope = delegate.convert(value);
            return envelope.items;
        };
    }

所以现在我可以使用Call<List<Item>> callapi();拨打电话。

但由于某种原因,verify()电话不起作用。在这种情况下的响应始终为null。如果我添加此检查 -

if (type != ApiResponse.class)
    return null;
转换器中的

然后它可以工作但奇怪的是导致callapi()无法抛出错误Expected BEGIN_ARRAY but was BEGIN_OBJECT。为什么转换器不工作?另外,如果转换器无法解析json响应,那么不应该在下一个转换器上进行Retrofit吗?

1 个答案:

答案 0 :(得分:0)

由于参数中的typeCall的类型,因此跳过非List<Item>个案例的正确检查是 -

if (!type.equals(Types.newParameterizedType(List.class, Item.class)))
    return null;

如果呼叫类型不是List<Item>,这允许下一个转换器处理响应。