Java 未转换的Json对象获取类型不匹配

Java 未转换的Json对象获取类型不匹配,java,php,android,json,azure,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 ) { $us

当我尝试登录时,我的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);
        }
    }
}
if($conn){
$username=$_POST[“username”];
$password=$_POST[“password”];
//echo($username);
//回显“已建立连接。
”; $query=sprintf(“从用户名=?和密码=?”的用户中选择*”; $params1=数组($username,$password); $stmt=sqlsrv_query($conn,$query,$params1); 如果($stmt==false){ 模具(打印错误(sqlsrv_errors(),true)); } $Users=array(); 而($row=sqlsrv\u fetch\u数组($stmt,sqlsrv\u fetch\u ASSOC)){ $username1=$row['username']; $password1=$row['password']; } $Users[“username”]=$username1; $Users[“password”]=$password1; echo json_编码($Users); sqlsrv_free_stmt($stmt); sqlsrv_close($conn); }否则{ echo“无法建立连接。
”; 模具(打印错误(sqlsrv_errors(),true)); }
我的请求包括以下内容:

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);
        }
    }
}
公共类服务器请求{
进行对话进行对话;
公共静态最终int连接\u超时=1000*15;
公共静态最终字符串服务器\u地址=”http://cosy.azurewebsites.net/";
公共服务器请求(上下文){
progressDialog=新建progressDialog(上下文);
progressDialog.setCancelable(假);
progressDialog.setTitle(“处理…”);
progressDialog.setMessage(“请稍候…”);
}
public void fetchUserDataAsyncTask(用户用户,GetUserCallback userCallBack){
progressDialog.show();
新建fetchUserDataAsyncTask(用户,userCallBack).execute();
}
公共类fetchUserDataAsyncTask扩展了AsyncTask{
用户;
GetUserCallback-userCallBack;
公共fetchUserDataAsyncTask(用户用户,GetUserCallback userCallBack){
this.user=用户;
this.userCallBack=userCallBack;
}
@凌驾
受保护的用户doInBackground(无效…参数){
ArrayList dataToSend=新的ArrayList();
添加(新的BasicNameValuePair(“username”,user.username));
添加(新的BasicNameValuePair(“密码”,user.password));
HttpParams httpRequestParams=新的BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpRequestParams,连接超时);
HttpConnectionParams.setSoTimeout(httpRequestParams,连接超时);
HttpClient客户端=新的默认HttpClient(httpRequestParams);
HttpPost=newhttppost(服务器地址+“FetchUserData.php”);
用户returnedUser=null;
试一试{
post.setEntity(新的UrlEncodedFormEntity(dataToSend));
HttpResponse HttpResponse=client.execute(post);
HttpEntity entity=httpResponse.getEntity();
字符串结果=EntityUtils.toString(实体);
JSONObject jObject=新JSONObject(结果);
如果(jObject.length()!=0){
日志v(“已发生”、“2”);
returnedUser=新用户(User.username、User.password);
}
}捕获(例外e){
e、 printStackTrace();
}
返回者;
}
@凌驾
PostExecute上受保护的void(用户返回用户){
super.onPostExecute(returnedUser);
progressDialog.disclose();
userCallBack.done(returnedUser);
}
}
}

我已经花了很长时间在这件事上了,我只是不知道我哪里出了问题。任何帮助都将不胜感激

PHP响应字符串似乎包含一些特殊字符或混乱的代码。因此Java中的
org.json
库无法将响应字符串转换为JSONObject

您可以尝试使用PHP中的函数
urlencode
urldecode
来处理字符串。请参阅下面的代码

while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    $username1 = urlencode($row['username']);
    $password1= urlencode($row['password']);
}
修改下面的代码

while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    $username1 = urlencode($row['username']);
    $password1= urlencode($row['password']);
}


希望能有帮助。如有任何问题,请随时通知我。

您从服务器检索到的值是多少?它似乎不是有效的JSON。@Chris在提交表单时对其进行html测试时,返回以下值:{“用户名”:“joe”,“密码”:“bloggs”}从应用程序运行它时如何?在返回值后设置一个断点,看看返回的是什么。我一直认为这是可行的,因为azure在需要额外的东西时遇到了一些问题,但它似乎仍然会发出相同的错误。不知道原因,但谢谢你的建议,真的很感激@EoinÓCribín分析问题的想法是检查响应体是否包含一些Unicode字符,如
\uffef
。你可以试着下载它作为一个txt文件,并使用Hexedit逐个检查字节码,然后通过更改一些代码来调试你的代码。修复了它你是对的,最后只是我忘了添加一些东西!非常感谢你的帮助!