JSONException:名称必须是字符串

Posted

技术标签:

【中文标题】JSONException:名称必须是字符串【英文标题】:JSONException: Names must be strings 【发布时间】:2016-02-26 05:22:38 【问题描述】:

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

org.json.JSONException: Names must be strings, but "username":"bryan625","name":"bryan penaloza","sex":"male","age":21,"password" :"test" 在 "username":"bryan625","name":"bryan penaloza","sex":"male","age":21 的字符 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);

?>

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

【问题讨论】:

哪一行导致错误? 我不确定,它只是在字符 88 "username":"bryan625","name":"bryan penaloza","sex":"male","age ":21,"password":"test" 我在上面的问题中发布了错误 你能分享一个带有 PHP 响应的 sn-p 吗? 【参考方案1】:

啊,简单的错误。您会注意到 char 88 是 json 字符串中倒数第二个 。你需要改变: new JSONObject("" + result + "")new JSONObject(result)。封装的 已经包含在 PHP 中了。

将您的 JSON 传递给 JSON 验证器也指出了问题:

输入:


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

输出:

Parse error on line 1:
            "username"
-----^
Expecting 'STRING', ''

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


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

【讨论】:

啊谢谢,它不再给我错误,但它仍然没有做我想做的事情。它应该打开一个显示用户信息的新活动,所以我猜到下一个错误......大声笑 欢迎编程! 下一个错误/错误几乎就是游戏的名称。 ;) 相信我,我知道我正在为这个应用程序做的课程是这样的:“去做一个 android 应用程序并自学代码。” 我得到了,org.json.JSONArray 类型的 Value [] 无法转换为 JSONObject 你知道这是为什么吗? 我会打印出你的 PHP 输入。我怀疑你有[](一个空数组)。这不能转换为对象。

以上是关于JSONException:名称必须是字符串的主要内容,如果未能解决你的问题,请参考以下文章

JSON_exc2

JSON解析_exc1

JSONException:字符 0 处的输入结束

JSONException 故障排除:在字符 0 Android 处输入结束

Volley JSONException:输入在字符 0 处结束

FastJson处理数据出现错误 com.alibaba.fastjson.JSONException: syntax error, expect {, actual error, pos 1(示例代