【问题标题】:Json object not being converted getting type mismatch未转换 Json 对象获取类型不匹配
【发布时间】:2016-01-25 16:18:30
【问题描述】:

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

我已经在这方面花费了很多时间,但我只是找不到哪里出错了,任何帮助都将不胜感激!

【问题讨论】:

  • 您从服务器检索到的值是多少?它似乎不是有效的 JSON。
  • @Chris 在对其提交表单进行 html 测试时返回此值:{"username":"joe","password":"bloggs"}
  • 从应用程序运行时会怎样?返回值后设置断点,看看返回什么。

标签: java php android json azure


【解决方案1】:

似乎是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']);
}

还有

echo urldecode(json_encode($Users));

希望对您有所帮助。有任何问题,请随时告诉我。

【讨论】:

  • 认为这会起作用,因为我在 azure 上遇到了一些问题,需要类似的额外东西,但它似乎仍然会发出同样的错误。不知道它的原因,但感谢您的建议真的很感激!
  • @EoinÓCribín 分析问题的想法是检查响应正文是否包含一些 Unicode 字符,例如 \uffef。您可以尝试将其下载为txt文件并使用Hexedit逐一查看字节码,然后通过更改一些代码来调试您的代码。
  • 修复它你最后是对的只是我忘记添加一些东西!非常感谢您的帮助!
猜你喜欢
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 2013-12-25
  • 2020-07-28
  • 1970-01-01
相关资源
最近更新 更多