gpt4 book ai didi

java - 改造多种响应类型

转载 作者:太空宇宙 更新时间:2023-11-04 09:08:22 25 4
gpt4 key购买 nike

如何使用 Retrofit2 解析这两种 API 响应?

好的响应(HTTP 200):

{
"data": {
"foo": "bar"
}
}

错误响应(HTTP 200):

{
"error": {
"foo": "bar"
}
}

我已经阅读了大量的问题和教程,但我不知道该怎么做,我已经尝试过:

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();

这是我的 ItemTypeAdapterFactory:

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接口(interface)上声明的类型,在Call中:

@GET("login")
Call<?> login(@Query(Constants.API_PARAM_TOKEN) String token);

您能给我指出正确的方向吗?

最佳答案

在类似的情况下,我曾经使用 JsonObject 作为类型,所以你的函数将如下所示:

@GET("login")
Call<?> login(@Query(Constants.API_PARAM_TOKEN) String token);

接下来,当您进行改造调用时,您将响应保留为字符串。因此,在您的 java 代码中,执行如下操作:

Call<JsonObject> call = RetrofitClient.getAPIService().login('YOUR_INPUT');
Data data = null;
Error error = null;
call.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
if(response.isSuccessfull()){
String jsonString = response.body().toString();
if(jsonString.contains("data:")){
data = new Gson().fromJson(jsonString,Data.class);
}else{
error = new Gson().fromJson(jsonString,Error.class);
}
}
}

在这里,我使用了DataError这两个类。他们是 POJO。所以数据看起来像这样:

Data.java:

public class Data implements Serializable{
@SerializedName("foo")
@Expose
private Foo foo; // Foo is your desired data type

}

错误也是如此。因此,根据您的其余代码,进行必要的更改。祝你好运。

关于java - 改造多种响应类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59945168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com