Json对象未被转换,导致类型不匹配

时间:2016-01-25 16:18:31

标签: java php android json azure

当我尝试登录时,我的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);
        }
    }
}

我已经花了很长时间在这上面,我只是无法找到我出错的地方任何帮助都会受到赞赏!!

1 个答案:

答案 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));

希望它有所帮助。如有任何疑虑,请随时告诉我。