当我尝试登录时,我的android logcat上出现以下错误。
1492-1639/net.azurewebsites.cosy W/System.err﹕ org.json.JSONException: Value The of type java.lang.String cannot be converted to JSONObject
我肯定会收到我的服务器的请求,所以我不知道它是否正在返回它的价值,或者它是否在应用程序中出现问题并且无法转换它。
我的php如下:
if( $conn ) {
$username = $_POST["username"];
$password = $_POST["password"];
//echo($username);
// echo "Connection established.<br />";
$query = sprintf("SELECT * from Users where username = ? and password = ?");
$params1 = array( $username, $password);
$stmt = sqlsrv_query($conn, $query, $params1);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
$Users = array();
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$username1 = $row['username'];
$password1= $row['password'];
}
$Users["username"] = $username1;
$Users["password"] = $password1;
echo json_encode($Users);
sqlsrv_free_stmt($stmt);
sqlsrv_close( $conn );
} else {
echo "Connection could not be established.<br />";
die( print_r( sqlsrv_errors(), true));
}
我的要求包括以下内容:
public class ServerRequests {
ProgressDialog progressDialog;
public static final int CONNECTION_TIMEOUT = 1000 * 15;
public static final String SERVER_ADDRESS = "http://cosy.azurewebsites.net/";
public ServerRequests(Context context) {
progressDialog = new ProgressDialog(context);
progressDialog.setCancelable(false);
progressDialog.setTitle("Processing...");
progressDialog.setMessage("Please wait...");
}
public void fetchUserDataAsyncTask(User user, GetUserCallback userCallBack) {
progressDialog.show();
new fetchUserDataAsyncTask(user, userCallBack).execute();
}
public class fetchUserDataAsyncTask extends AsyncTask<Void, Void, User> {
User user;
GetUserCallback userCallBack;
public fetchUserDataAsyncTask(User user, GetUserCallback userCallBack) {
this.user = user;
this.userCallBack = userCallBack;
}
@Override
protected User doInBackground(Void... params) {
ArrayList<NameValuePair> dataToSend = new ArrayList<>();
dataToSend.add(new BasicNameValuePair("username", user.username));
dataToSend.add(new BasicNameValuePair("password", user.password));
HttpParams httpRequestParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpRequestParams, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpRequestParams, CONNECTION_TIMEOUT);
HttpClient client = new DefaultHttpClient(httpRequestParams);
HttpPost post = new HttpPost(SERVER_ADDRESS + "FetchUserData.php");
User returnedUser = null;
try {
post.setEntity(new UrlEncodedFormEntity(dataToSend));
HttpResponse httpResponse = client.execute(post);
HttpEntity entity = httpResponse.getEntity();
String result = EntityUtils.toString(entity);
JSONObject jObject = new JSONObject(result);
if (jObject.length() != 0) {
Log.v("happened", "2");
returnedUser = new User(user.username, user.password);
}
} catch (Exception e) {
e.printStackTrace();
}
return returnedUser;
}
@Override
protected void onPostExecute(User returnedUser) {
super.onPostExecute(returnedUser);
progressDialog.dismiss();
userCallBack.done(returnedUser);
}
}
}
我已经花了很长时间在这上面,我只是无法找到我出错的地方任何帮助都会受到赞赏!!
答案 0 :(得分:1)
似乎PHP响应字符串包含一些特殊字符或杂乱的代码。因此,Java中的org.json
库无法将响应字符串转换为JSONObject。
您可以尝试使用urlencode
&amp;功能PHP中的urldecode
来处理字符串。请参阅以下代码。
修改以下代码。
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$username1 = urlencode($row['username']);
$password1= urlencode($row['password']);
}
并且
echo urldecode(json_encode($Users));
希望它有所帮助。如有任何疑虑,请随时告诉我。