繁体   English   中英

为列表类型改造定制转换器工厂

[英]Retrofit custom converter factory for list type

我对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();进行Call<List<Item>> callapi();

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

if (type != ApiResponse.class)
    return null;

在转换器中工作,但是奇怪的是使callapi()无法引发错误Expected BEGIN_ARRAY but was BEGIN_OBJECT 为什么转换器不工作? 此外,万一某个转换器无法解析json响应,则Retrofit不应该退回到下一个转换器上吗?

由于type的参数是类型Call ,正确的检查,以跳过非List<Item>的情况是-

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

如果调用的类型不是List<Item>则允许下一个转换器处理响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM