Android 修改json响应中的2.0句柄错误

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(

我正在改造2.0(非常棒)来处理API响应。 当API成功响应时,所有这些都能正常工作,我从json响应返回所需的转换对象

以下是请求的示例:

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
方法,该方法将检查is
error
字段
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);
}