我如何使用Retrofit2来解析这两种API响应?
确定响应(HTTP 200):
{
"data": {
"foo": "bar"
}
}
错误响应(HTTP 200):
{
"error": {
"foo": "bar"
}
}
我已经读了大量的SO问题和教程,但我不知道如何做到这一点,我已经尝试:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapterFactory(new ItemTypeAdapterFactory());
Gson gson = gsonBuilder.create();
final Retrofit retrofit = new Retrofit.Builder()
.client(getOkHttpClient())
.baseUrl(Constants.API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
这是我的项目类型适配器工厂:
class ItemTypeAdapterFactory implements TypeAdapterFactory {
public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) {
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
return new TypeAdapter<T>() {
public void write(JsonWriter out, T value) throws IOException {
delegate.write(out, value);
}
public T read(JsonReader in) throws IOException {
JsonElement jsonElement = elementAdapter.read(in);
if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
// Data key
if (jsonObject.has(Constants.JSON_KEY_DATA)) {
JsonElement jsonData = jsonObject.get(Constants.JSON_KEY_DATA);
// Primitive
if (jsonData.isJsonPrimitive()) {
jsonElement = jsonData.getAsJsonPrimitive();
}
// JSON object
else if (jsonData.isJsonObject()) {
jsonElement = jsonData;
}
// JSON object array
else if (jsonData.isJsonArray()) {
jsonElement = jsonData.getAsJsonArray();
}
}
}
return delegate.fromJsonTree(jsonElement);
}
}.nullSafe();
}
}
但是现在我不知道要在retrofit2接口上声明的类型,在Call里面:
@GET("login")
Call<?> login(@Query(Constants.API_PARAM_TOKEN) String token);
你能给我指一下正确的方向吗?
2条答案
按热度按时间oknwwptz1#
在一个类似的例子中,我曾经使用
JsonObject
作为类型,所以你的函数看起来像这样:接下来,当你进行一个翻新调用时,你会把响应保存为一个字符串。
在这里,我使用了
Data
和Error
这两个类。它们是POJO。因此,数据可以看起来像这样:Data.java
:对于
Error
也是如此。所以根据你剩下的代码,做必要的修改。祝你好运。xwbd5t1u2#
我以前也做过类似的事
基本响应
}
改装接口
这种方法在您控制RESTAPI结构时可以正常工作。
唯一的问题是您需要在使用数据对象之前使用isSuccess方法检查每个请求是否成功。