【发布时间】:2017-09-17 10:28:36
【问题描述】:
每当我收到错误时,错误正文如下:
[
{
"errorCode": 10001,
"resource": null,
"resourceId": null,
"field": null,
"parameter": null,
"header": null,
"allowedValues": null,
"maxLength": null,
"minLength": null
}
]
错误主体是一个数组。对于许多 API 方法的成功,我有不同的机构,但错误数组响应是标准化的。我尝试了很多事情
使用通用类型成功响应和错误响应数组制作包装类,并为此制作反序列化器,但我无法从类型变量和参数化类反序列化。
制作了一个 ErrorDeserializer,但我不知道如何让 Retrofit 将它用于错误响应。
我绝对可以在每次回调时为我的所有 api 方法序列化原始字符串,但是我有这么多,我需要通用的解决方案。如果我没有正确解释自己,请询问。
我将添加我尝试过的示例(但它们将不完整):
响应包装类:
public class ResponseWrap<T> {
@Nullable
private final T response;
@Nullable
private final List<ErrorResponse> errorResponses;
public ResponseWrap(@Nullable T response, @Nullable List<ErrorResponse> errorResponses) {
this.response = response;
this.errorResponses = errorResponses;
}
}
错误响应类:
public class ErrorResponse {
private int errorCode;
private String resource;
private String resourceId;
private String field;
private String parameter;
private String header;
private String allowedValues;
private int maxLength;
private int minLength;
// getters and setters
}
错误反序列化器:
public class ErrorDeserializer implements JsonDeserializer<ArrayList<ErrorResponse>> {
@Override
public ArrayList<ErrorResponse> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
Gson gson = new Gson();
Type listType = new TypeToken<ArrayList<ErrorResponse>>(){}.getType();
ArrayList<ErrorResponse> list = new Gson().fromJson(json, listType);
final JsonArray jsonArray = json.getAsJsonArray();
for (int i = 0; i < jsonArray.size(); i++) {
ErrorResponse error = new ErrorResponse();
JsonObject jsonObject = jsonArray.get(i).getAsJsonObject();
error.setErrorCode(jsonObject.get("errorCode").getAsInt());
error.setResource(jsonObject.get("resource").getAsString());
error.setResourceId(jsonObject.get("resourceId").getAsString());
error.setField(jsonObject.get("field").getAsString());
error.setParameter(jsonObject.get("parameter").getAsString());
error.setHeader(jsonObject.get("header").getAsString());
error.setAllowedValues(jsonObject.get("allowedValues").getAsString());
error.setMaxLength(jsonObject.get("maxLength").getAsInt());
error.setMinLength(jsonObject.get("minLength").getAsInt());
list.add(error);
}
return list;
}
}
响应包装反序列化器 - 它不起作用,2 个错误:
列表错误 = new Gson().fromJson(jsonObject.getAsJsonObject("error"), ArrayList.class); // 不能从参数化类中选择
-
T 成功 = new Gson().fromJson(jsonObject, T.class); // 不能从类型变量中选择
public class ResponseWrapDeserializer<T> implements JsonDeserializer<ResponseWrap<T>> { @Override public ResponseWrap<T> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { // Get JsonObject final JsonObject jsonObject = json.getAsJsonObject(); if (jsonObject.has("error")) { Gson gson = new GsonBuilder() .registerTypeAdapter(typeOfT, new ErrorDeserializer()) .setDateFormat("yyyy-MM-dd'T'HH:mm:ss") .create(); List<ErrorResponse> error = new Gson().fromJson(jsonObject.getAsJsonObject("error"), ArrayList<ErrorResponse>.class); return new ResponseWrap<T>(null, error); } else { T success = new Gson().fromJson(jsonObject, T.class); return new ResponseWrap<T>(success, null); } } }
我们的想法是像这样使用它们:
@POST("Login")
Call<ResponseWrap<AccessTokenResponse>> Login(@Body LoginRequest request);
但由于上述原因,我不能。
问题是:如何使用 Retrofit2 以通用方式处理数组中的错误响应?
【问题讨论】:
标签: java android gson retrofit2