我正在尝试使用Retrofit 2进行newtwork请求。从日志中,我可以看到我正在接收来自服务器的响应和正确的结果。但是在onResponse正文中,我无法解析响应。
我在
处收到例外JSONObject jsonObject = new JSONObject(response.body().toString());
在我的php文件中,确实添加了标头
header('Content-type=application/json; charset=utf-8');
然后我使用以下方法返回响应
echo json_encode($RETURN_DATA,JSON_FORCE_OBJECT);
但是在logcat中,我看到我的响应与标题不一样
Content-Type: text/html; charset=UTF-8
我的代码:
public void login(View view) {
mApiService.loginRequest(input_username.getText().toString(), MD5.getMd5(input_password.getText().toString()))
.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if(response.isSuccessful()){
//Loading dismiss
//Logger.getLogger().d(String.valueOf(response.code()), Logger.LOGGER_DEPTH.ACTUAL_METHOD);
//Logger.getLogger().d(String.valueOf(response.body()), Logger.LOGGER_DEPTH.ACTUAL_METHOD);
try {
JSONObject jsonObject = new JSONObject(response.body().toString());
} catch (JSONException e) {
// e.printStackTrace();
Logger.getLogger().d(e.toString(), Logger.LOGGER_DEPTH.ACTUAL_METHOD);
}
}else{
//Loading dismiss
Logger.getLogger().d(String.valueOf(response.code()), Logger.LOGGER_DEPTH.ACTUAL_METHOD);
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
//Loading dismiss
Logger.getLogger().d(String.valueOf(call.isCanceled()),t, Logger.LOGGER_DEPTH.ACTUAL_METHOD);
}
});
}
这是我的日志
05-23 06:18:46.011 7889-7963/com.example.myapplication D/OkHttp: <-- 200 OK http://192.168.56.1/AndroidServer/login.php (301ms)
05-23 06:18:46.012 7889-7963/com.example.myapplication D/OkHttp: Date: Thu, 23 May 2019 06:18:46 GMT
05-23 06:18:46.012 7889-7963/com.example.myapplication D/OkHttp: Server: Apache/2.4.37 (Win32) OpenSSL/1.1.1a PHP/7.2.13
05-23 06:18:46.012 7889-7963/com.example.myapplication D/OkHttp: X-Powered-By: PHP/7.2.13
05-23 06:18:46.012 7889-7963/com.example.myapplication D/OkHttp: Content-Length: 64
05-23 06:18:46.012 7889-7963/com.example.myapplication D/OkHttp: Keep-Alive: timeout=5, max=100
05-23 06:18:46.012 7889-7963/com.example.myapplication D/OkHttp: Connection: Keep-Alive
05-23 06:18:46.012 7889-7963/com.example.myapplication D/OkHttp: Content-Type: text/html; charset=UTF-8
05-23 06:18:46.012 7889-7963/com.example.myapplication D/OkHttp: {"TITLE":"Authentication Successful","MESSAGE":"Welcome Back !"}
05-23 06:18:46.012 7889-7963/com.example.myapplication D/OkHttp: <-- END HTTP (64-byte body)
05-23 06:18:46.023 7889-7889/com.example.myapplication D/ActivityLogin$1[onResponse] - 61: okhttp3.ResponseBody$Companion$create$1@25aa0e1c
05-23 06:18:46.024 7889-7889/com.example.myapplication D/ActivityLogin$1[onResponse] - 85: org.json.JSONException: Value okhttp3.ResponseBody$Companion$create$1@25aa0e1c of type java.lang.String cannot be converted to JSONObject
答案 0 :(得分:0)
首先,您应该创建一个关于响应的类,以将您的响应映射到它。
然后使用Gson
将JSON
转换为Java对象(您的对象),如下所示:
将Gson添加到您的gradle中:
implementation 'com.google.code.gson:gson:2.8.5'
在您的活动或片段中:
Gson gson = new Gson();
YourResponseClass object = new YourResponseClass();
object = gson.fromJson(response.body().toString(), YourResponseClass.class);
在this上了解有关Gson的更多信息
答案 1 :(得分:0)
尝试使用Gson
库。包括在项目中:
https://mvnrepository.com/artifact/com.google.code.gson/gson/2.7
代替JSONObject jsonObject = new JSONObject(response.body().toString());
使用Gson().fromJson(yourResponse, Example.class);
为此,请声明新类,例如:
package com.example;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Example {
@SerializedName("TITLE")
@Expose
private String tITLE;
@SerializedName("MESSAGE")
@Expose
private String mESSAGE;
public String getTITLE() {
return tITLE;
}
public void setTITLE(String tITLE) {
this.tITLE = tITLE;
}
public String getMESSAGE() {
return mESSAGE;
}
public void setMESSAGE(String mESSAGE) {
this.mESSAGE = mESSAGE;
}
}
顺便说一句,如果您很好奇我如何简化本节课,可以转到该链接:http://www.jsonschema2pojo.org/
答案 2 :(得分:0)
我不知道为什么,但这以某种方式解决了我的问题。我在下面的链接中看到了解决方案。而不是使用
JSONObject jsonObject = new JSONObject(response.body().string());
我的参考: How does OkHttp get Json string?
也许有人可以弄清楚为什么.toString不起作用?