Android 修改json响应中的2.0句柄错误
我正在改造2.0(非常棒)来处理API响应。 当API成功响应时,所有这些都能正常工作,我从json响应返回所需的转换对象 以下是请求的示例:Android 修改json响应中的2.0句柄错误,android,retrofit2,Android,Retrofit2,我正在改造2.0(非常棒)来处理API响应。 当API成功响应时,所有这些都能正常工作,我从json响应返回所需的转换对象 以下是请求的示例: ServiceAPI.getUser(new Callback<User>() { @Override public void onResponse(Call<User> call, Response<User> response) { User user = response.body(
ServiceAPI.getUser(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
User user = response.body(); // user is my POJO
}
@Override
public void onFailure(Call<User> call, final Throwable t) {
Log.e(TAG, "Error: " + t.getMessage())
}
});
问题是改装“响应”仍然成功,并且errorBody为空
因此,在这里,我想将其转换为RestError POJO(如下所示),并在调用getUser方法时将其发送到调用内部
public class RestError {
private int code;
private String message;
private String type;
public RestError(int code, String message, String type) {
this.code = code;
this.message = message;
this.type = type;
}
}
有没有办法解决这个问题
更新:
我在ItemTypeAdatperFactory中添加了这个
public T read(JsonReader in) throws IOException {
JsonElement jsonElement = elementAdapter.read(in);
if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("data")) {
jsonElement = jsonObject.get("data");
} else if (jsonObject.has("error")) {
jsonElement = jsonObject.get("error");
TypeAdapter<RestError> restErrorTypeAdapter = gson.getAdapter(RestError.class);
RestError error = restErrorTypeAdapter.fromJsonTree(jsonElement);
return (T) error;
}
}
return delegate.fromJsonTree(jsonElement);
}
publictread(JsonReader-in)抛出IOException{
JsonElement JsonElement=elementAdapter.read(in);
if(jsonElement.isJsonObject()){
JsonObject=jsonElement.getAsJsonObject();
if(jsonObject.has(“数据”)){
jsonElement=jsonObject.get(“数据”);
}else if(jsonObject.has(“error”)){
jsonElement=jsonObject.get(“错误”);
TypeAdapter restErrorTypeAdapter=gson.getAdapter(RestError.class);
RestError error=restErrorTypeAdapter.fromJsonTree(JSOneElement);
返回(T)错误;
}
}
从JSONTREE(jsonElement)返回委托;
}
我创建了一个自定义回调,如下所示:
public abstract static class CustomCallback<T> implements Callback<T> {
public abstract void onError(RestError error);
public abstract void onSuccess(T body);
@Override
public void onResponse(Call<T> call, Response<T> response) {
if(response.body() instanceof RestError) {
onError((RestError) response.body());
} else {
onSuccess(response.body());
}
}
@Override
public void onFailure(Call<T> call, Throwable t) {
Log.e(TAG, t.toString());
}
}
公共抽象静态类CustomCallback实现回调{
公开摘要无效onError(RestError错误);
公开摘要无效(T体);
@凌驾
公共void onResponse(调用、响应){
if(response.body()instanceof RestError){
onError((RestError)response.body());
}否则{
onSuccess(response.body());
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.e(TAG,t.toString());
}
}
那么现在该怎么打电话了:
ServiceAPI.getUser(new ServiceAPI.CustomCallback<User>() {
@Override
public void onError(RestError error) {
Log.e(TAG, error.toString());
}
@Override
public void onSuccess(User body) {
Log.d(TAG, body.toString());
User user = body;
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Log.e(TAG, t.toString());
}
});
ServiceAPI.getUser(新ServiceAPI.CustomCallback(){
@凌驾
公共无效onError(RestError错误){
Log.e(标记,error.toString());
}
@凌驾
成功时的公共无效(用户主体){
Log.d(标记,body.toString());
用户=身体;
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.e(TAG,t.toString());
}
});
因此,现在当发生错误时,我从onError()获取它,否则为onSuccess(),并且似乎完成了这项工作
您觉得怎么样?您可以从一些
响应
类扩展所有POJO,该类将包含字段RestError error
。然后,您可以制作一些issusccessful
方法,该方法将检查iserror
字段null
,并正确处理它。在我看来,您可以像这样定制ItemTypeAdapterFactory
来检查响应是否是您的数据或是错误
public T read(JsonReader in) throws IOException {
JsonElement jsonElement = elementAdapter.read(in);
if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("data")) {
jsonElement = jsonObject.get("data");
} else if(jsonObject.has("error"){
jsonElement = jsonObject.get("error");
}
}
//TODO: need to handle your parsing here (to data or to error)
return delegate.fromJsonTree(jsonElement);
}
是的!同时,我以这种方式处理它:TypeAdapter restErrorTypeAdapter=gson.getAdapter(RestError.class);RestError error=restErrorTypeAdapter.fromJsonTree(JSOneElement);但是我仍然不知道如何发送这个错误来代替我的用户pojo,我的方法是:
classyourresponse{@JsonProperty(“data”)public-ArrayList-data;@JsonProperty(“error”)public-ArrayList-error;}
调用getUser(@Path(“userId”)String-userId)代码>如果您需要数据!=null,则它不是错误响应。我用的是杰克森,不是格森,但这个想法有点像我更新了我的问题,你怎么看?(谢谢你们的帮助)你们觉得这个解决方案怎么样?你们能把你们的代码发到我在Thungle的邮箱里吗。it@gmail.com. 我将在IDE中检查它。也许我可以给你一个解决这个问题的方法,我认为这不适合改装2.0。如果HTTP状态码不是200,那么responseBody为null,您的POJO为null,因此在这种情况下扩展是无用的。@Geralt_Encore,我试过了,它没有解决我的问题我实际上也遇到了同样的问题,如果是200,我就可以得到响应。但是我想从202得到东西。所以对于200响应,我们已经创建了一个SuccessResponse GSON类。对于202类,我还创建了另一个依赖于JSON响应的类。我无法同时使用这两种方法。我也尝试了扩展。但它们都不起作用。有什么建议吗?
ServiceAPI.getUser(new ServiceAPI.CustomCallback<User>() {
@Override
public void onError(RestError error) {
Log.e(TAG, error.toString());
}
@Override
public void onSuccess(User body) {
Log.d(TAG, body.toString());
User user = body;
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Log.e(TAG, t.toString());
}
});
public T read(JsonReader in) throws IOException {
JsonElement jsonElement = elementAdapter.read(in);
if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("data")) {
jsonElement = jsonObject.get("data");
} else if(jsonObject.has("error"){
jsonElement = jsonObject.get("error");
}
}
//TODO: need to handle your parsing here (to data or to error)
return delegate.fromJsonTree(jsonElement);
}