我有两个不同的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吗?
答案 0 :(得分:0)
由于参数中的type
是Call
的类型,因此跳过非List<Item>
个案例的正确检查是 -
if (!type.equals(Types.newParameterizedType(List.class, Item.class)))
return null;
如果呼叫类型不是List<Item>
,这允许下一个转换器处理响应。