Retrofit response.errorBody 无法转换为 JsonObject 或 Java Object
Retrofit response.errorBody cannot be converted to JsonObject or Java Obejct
当调用 API 时,它 return onScuccess 中的一个对象,状态代码为 201,当不在 onSuccess 中时,状态代码为 422,它也会给出这样的对象
{
"errors": [
"Usuário não encontrado"
]
}
我尝试了很多方法,包括使用此代码的改造官网
public class ErrorUtils {
public static APIError parseError(Response<JsonObject> response) {
Converter<ResponseBody, APIError> converter =
ServiceGenerator.retrofit()
.responseBodyConverter(APIError.class, new Annotation[0]);
APIError error;
try {
error = converter.convert(response.errorBody());
} catch (IOException e) {
Log.v("LoginUser", "IOException -> " + e.getMessage());
return new APIError();
}
return error;
}
public static class ServiceGenerator {
public static final String API_BASE_URL = ApiClient.BASE_URL;
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
public static Retrofit retrofit = null;
private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
public static Retrofit retrofit() {
retrofit = builder.client(httpClient.build()).build();
return retrofit;
}
}}
API 错误 Class
public class APIError {
private String[] errors;
public String[] getErrors() {
return errors;
}
public void setErrors(String[] errors) {
this.errors = errors;
}
@Override
public String toString() {
return "ClassPojo [errors = " + errors + "]";
}}
但是这样它会进入 Error Utils class 的 catch 块,异常是
End of input at line 1 column 1 path $
解决此问题将不胜感激。但是请记住,我已经彻底查看了这两个错误,然后我 post 这个问题。
在您的 onResponse
回调方法中尝试此代码
if (response.isSuccessful() && response.code() == 201) {
// Todo
} else {
if (response.errorBody() != null) {
try {
JSONObject jsonObject = new JSONObject(response.errorBody().string());
JSONArray jsonArray = jsonObject.getJSONArray("errors");
List<String> errorStringList = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
errorStringList.add(jsonArray.get(i).toString());
}
} catch (JSONException | IOException e) {
e.printStackTrace();
}
}
}
您可以将 errorStringList
传递给 ApiError
的实例
ApiError apiError = new ApiError();
apiError.setError(errorStringList.toArray(new String[0]))
当调用 API 时,它 return onScuccess 中的一个对象,状态代码为 201,当不在 onSuccess 中时,状态代码为 422,它也会给出这样的对象
{
"errors": [
"Usuário não encontrado"
]
}
我尝试了很多方法,包括使用此代码的改造官网
public class ErrorUtils {
public static APIError parseError(Response<JsonObject> response) {
Converter<ResponseBody, APIError> converter =
ServiceGenerator.retrofit()
.responseBodyConverter(APIError.class, new Annotation[0]);
APIError error;
try {
error = converter.convert(response.errorBody());
} catch (IOException e) {
Log.v("LoginUser", "IOException -> " + e.getMessage());
return new APIError();
}
return error;
}
public static class ServiceGenerator {
public static final String API_BASE_URL = ApiClient.BASE_URL;
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
public static Retrofit retrofit = null;
private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
public static Retrofit retrofit() {
retrofit = builder.client(httpClient.build()).build();
return retrofit;
}
}}
API 错误 Class
public class APIError {
private String[] errors;
public String[] getErrors() {
return errors;
}
public void setErrors(String[] errors) {
this.errors = errors;
}
@Override
public String toString() {
return "ClassPojo [errors = " + errors + "]";
}}
但是这样它会进入 Error Utils class 的 catch 块,异常是
End of input at line 1 column 1 path $
解决此问题将不胜感激。但是请记住,我已经彻底查看了这两个错误,然后我 post 这个问题。
在您的 onResponse
回调方法中尝试此代码
if (response.isSuccessful() && response.code() == 201) {
// Todo
} else {
if (response.errorBody() != null) {
try {
JSONObject jsonObject = new JSONObject(response.errorBody().string());
JSONArray jsonArray = jsonObject.getJSONArray("errors");
List<String> errorStringList = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
errorStringList.add(jsonArray.get(i).toString());
}
} catch (JSONException | IOException e) {
e.printStackTrace();
}
}
}
您可以将 errorStringList
传递给 ApiError
ApiError apiError = new ApiError();
apiError.setError(errorStringList.toArray(new String[0]))