我正在尝试为 Android 应用程序创建登录和注册 Activity 。注册 Activity 工作正常,它可以将信息存储到托管在托管上的我的 Sql 数据库中,但登录 Activity 给了我这个错误...

org.json.JSONException:名称必须是字符串,但 {"username":"bryan625","name":"bryan penaloza","sex":"male","age":21,"password":"test "} 在 {{"username":"bryan625","name":"bryan penaloza","sex":"male","age":21,"password"的第 88 位是 org.json.JSONObject 类型:“测试”}}

这是在我的 ServerRequest.java 类中获取用户数据的部分

我知道我使用的是已弃用的代码,但我修改了 gradle 使其正常工作。

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) {
                returnedUser = null;
            } else {

                String name = jObject.getString("name");
                String sex = jObject.getString("sex");
                int age = jObject.getInt("age");


                returnedUser = new User(user.username, name, sex, age, user.password);

            }

        } catch (Exception e) {
            e.printStackTrace();

        }


        return returnedUser;
    }


    @Override
    protected void onPostExecute(User returnedUser) {
        progressDialog.dismiss();
        userCallback.done(user);
        super.onPostExecute(returnedUser);

    }
}

这是此代码正在调用的我的 php 文件。
<?php
/*server, user, password, databse */
$conn=mysqli_connect("xxx", "xxx", "xxx","xxx");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

$password = $_POST["password"];
$username = $_POST["username"];

$statement = mysqli_prepare($conn, "SELECT * FROM User WHERE username = ? AND password = ?");
if($statement === FALSE){ die(mysqli_error($conn)); }

mysqli_stmt_bind_param($statement, "ss", $username, $password);


mysqli_stmt_execute($statement);
//printf("Error: %s.\n", mysqli_stmt_error($statement));
mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $id, $username, $name, $sex, $age, $password);
$user = array ();
while(mysqli_stmt_fetch($statement)){
    $user['username'] = $username;
    $user['name'] = $name;
    $user['sex'] = $sex;
    $user['age'] = $age;
    $user['password'] = $password;
}

echo json_encode($user);

mysqli_close($conn);

?>

我知道我已成功连接到数据库,因为它正在返回我为特定用户存储的值数组,但我不知道如何摆脱该错误。谢谢!

最佳答案

啊, 简单的错误 。您会注意到 char 88 是 json 字符串中倒数第二个 } 。你需要改变:new JSONObject("{" + result + "}")new JSONObject(result) 。封装的 {} 已经包含在 PHP 中。
将您的 JSON 传递到 JSON validator 也指出了这个问题:

您向已经有效的 JSON 添加了额外的括号。正确的 JSON 对象如下:

{
    "username": "bryan625",
    "name": "bryan penaloza",
    "sex": "male",
    "age": 21,
    "password": "test"
}

关于java - JSONException : Names must be strings,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33882304/

10-12 07:25
查看更多