![](/img/trans.png)
[英]Program type already present: retrofit2.Converter$Factory Retrofit compilation error
[英]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.