Java 如何解析改装请求中的以下错误响应?
我正在尝试解析改装队列的错误主体。日志将response.errorBody显示为Java 如何解析改装请求中的以下错误响应?,java,android,json,retrofit,retrofit2,Java,Android,Json,Retrofit,Retrofit2,我正在尝试解析改装队列的错误主体。日志将response.errorBody显示为 "{"response":["Image height must not exceed image width. Try a different image."]}" 这是我的密码: call.enqueue(new Callback<EditBlogResponse>() { @Override public void onResponse(Call
"{"response":["Image height must not exceed image width. Try a different image."]}"
这是我的密码:
call.enqueue(new Callback<EditBlogResponse>() {
@Override
public void onResponse(Call<EditBlogResponse> call, Response<EditBlogResponse> response) {
if(response.body() != null){
Log.d(TAG, "onEditResponse: " + response.body());
editBlogResponse.setValue(response.body().toString());
}else{
try {
Log.d(TAG, "onResponseError: " + response.errorBody().string());
JSONObject jsonObject = new JSONObject(response.errorBody().string());
JSONArray jsonArray = jsonObject.getJSONArray("response");
editBlogResponse.setValue(jsonArray.getString(0));
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void onFailure(Call<EditBlogResponse> call, Throwable t) {
t.printStackTrace();
editBlogResponse.setValue("failure");
}
});
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.body()!=null){
Log.d(标记“onEditResponse:+response.body());
editBlogResponse.setValue(response.body().toString());
}否则{
试一试{
Log.d(标记“onResponseError:+response.errorBody().string());
JSONObject=newJSONObject(response.errorBody().string());
JSONArray JSONArray=jsonObject.getJSONArray(“响应”);
setValue(jsonArray.getString(0));
}捕获(IOE异常){
e、 printStackTrace();
}捕获(JSONException e){
e、 printStackTrace();
}
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
t、 printStackTrace();
editBlogResponse.setValue(“失败”);
}
});
我收到一个系统错误
W/System.err: org.json.JSONException: End of input at character 0 of
at org.json.JSONTokener.syntaxError(JSONTokener.java:460)
at org.json.JSONTokener.nextValue(JSONTokener.java:101)
at org.json.JSONObject.<init>(JSONObject.java:164)
at org.json.JSONObject.<init>(JSONObject.java:181)
at com.example.brandonblog.Repository.Repository$3.onResponse(Repository.java:176)
at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$1.run(DefaultCallAdapterFactory.java:83)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
W/System.err:org.json.JSONException:输入结束于的字符0处
位于org.json.JSONTokener.syntaxError(JSONTokener.java:460)
位于org.json.JSONTokener.nextValue(JSONTokener.java:101)
位于org.json.JSONObject(JSONObject.java:164)
位于org.json.JSONObject(JSONObject.java:181)
位于com.example.brandonblog.Repository.Repository$3.onResponse(Repository.java:176)
在Reformation2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$1.run(DefaultCallAdapterFactory.java:83)
位于android.os.Handler.handleCallback(Handler.java:883)
位于android.os.Handler.dispatchMessage(Handler.java:100)
位于android.os.Looper.loop(Looper.java:214)
位于android.app.ActivityThread.main(ActivityThread.java:7356)
位于java.lang.reflect.Method.invoke(本机方法)
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
你知道我做错了什么吗 那么,在这种情况下,预期的响应也在
onResponse()块中。您必须在块中查找400
或4xx
状态代码,如下所示:
if(response.code() != 200) {
Log.d(TAG, "onEditResponseCode: " + response.code());
Log.d(TAG, "onEditResponse: " + response.body());
editBlogResponse.setValue(response.body().toString());
} else {
Log.d(TAG, "onEditResponsecode: " + response.code());
Log.d(TAG, "onEditResponse: " + response.body().response.get(0));
//because your message is always at the 0th position of the 'response' list
// You don't need to use any JSONObject or JSONArray etc for these.
}
试着让我知道它是否工作。让它工作,问题是这行:
editBlogResponse.setValue(jsonArray.getString(0));
它应该是get(),而不是getString:
完整工作响应:
public void onResponse(Call<EditBlogResponse> call, Response<EditBlogResponse> response) {
if(response.body() != null){
Log.d(TAG, "onEditResponse: " + response.body());
editBlogResponse.setValue(response.body().toString());
}else{
try {
JSONObject jObjError = new JSONObject (response.errorBody().string());
JSONArray array = jObjError.getJSONArray("response");
editBlogResponse.setValue(array.get(0).toString());
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void onResponse(调用、响应){
if(response.body()!=null){
Log.d(标记“onEditResponse:+response.body());
editBlogResponse.setValue(response.body().toString());
}否则{
试一试{
JSONObject jObjError=新的JSONObject(response.errorBody().string());
JSONArray数组=jObjError.getJSONArray(“响应”);
editBlogResponse.setValue(array.get(0.toString());
}捕获(JSONException e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
请尝试使用下面描述的POJO解析JSON
public class EditBlogResponse {
@SerializedName("response")
@Expose
private List<String> response = null;
public List<String> getResponse() {
return response;
}
public void setResponse(List<String> response) {
this.response = response;
}
}
公共类EditBlogResponse{
@SerializedName(“响应”)
@暴露
私有列表响应=null;
公共列表getResponse(){
返回响应;
}
公共无效设置响应(列表响应){
这个。反应=反应;
}
}
你好,布兰登,欢迎来到SO。你需要在这里提供一些东西。改装版本、类EditBlogResponse
和整个日志堆栈跟踪,哪一行导致异常?存储库中的行是什么。java:176
?您对成功和失败有不同的反应吗?邮递员的反应代码是什么?如果它显示200
或2xx
,则您将能够在onSuccess()中找到错误消息
。请与use共享您的服务器响应
,以便我们可以帮助您。您好,这里是邮差错误响应:{“response”:[“输入长度超过50个字符的正文”。]}
400响应。是的,回答是不同的。行是'JSONObject JSONObject=newjsonobject(response.errorBody().string())`更新了完整的堆栈跟踪,谢谢,我们同时发布了,是的,你的方法也有效。谢谢@布兰登,不客气。为什么要使用额外的包来实现这一点,而我的答案将其分解为几行,对吗?所以,你能不能让我的回答正确。这将是一个巨大的赞赏。快乐编码。
public class EditBlogResponse {
@SerializedName("response")
@Expose
private List<String> response = null;
public List<String> getResponse() {
return response;
}
public void setResponse(List<String> response) {
this.response = response;
}
}