繁体   English   中英

W/System.err: org.json.JSONException: 类型 java.lang.String 的值数据库无法转换为 JSONObject

[英]W/System.err: org.json.JSONException: Value Database of type java.lang.String cannot be converted to JSONObject

W/System.err: org.json.JSONException: 类型 java.lang.String 的值数据库无法转换为 JSONObject

Android Studio 中显示的错误

   W/System.err: org.json.JSONException: Value Database of type java.lang.String cannot be converted to JSONObject
    at org.json.JSON.typeMismatch(JSON.java:111)
    at org.json.JSONObject.<init>(JSONObject.java:163)
    at org.json.JSONObject.<init>(JSONObject.java:176)
    at com.abc.SignUp_Activity$6.onResponse(SignUp_Activity.java:122)
    W/System.err:     at com.abc.SignUp_Activity$6.onResponse(SignUp_Activity.java:118)
    at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82)
    at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29)
    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6944)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
    E/anyText: Database connected{"success":"0","message":"success"}

安卓代码:

private void registerUser() {
    final String email = etEmail.getText().toString().trim();
    final String name = etName.getText().toString().trim();
    final String password = etPassword.getText().toString().trim();

    final ProgressDialog progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("REGISTERING ACCOUNT......!!");
    progressDialog.show();

    if (TextUtils.isEmpty(email) && TextUtils.isEmpty(password) && TextUtils.isEmpty(name)) {
        Toast.makeText(this, "FILL ALL THE FIELD", Toast.LENGTH_SHORT).show();
    } else {

        StringRequest stringRequest = new StringRequest(Request.Method.POST,
                URL_REGIST,
                //Getting error here//  new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            //Getting error here//   JSONObject jsonObject = new JSONObject(response);
                            //Getting error here//   String success = jsonObject.getString("success");

                            if (success.equals("0")) {
                                progressDialog.dismiss();
                                Toast.makeText(SignUp_Activity.this, "REGISTER SUCCESS......!!", Toast.LENGTH_SHORT).show();
                            }
                            else {
                                Toast.makeText(SignUp_Activity.this, "EMAIL ALREADY EXISTS...!!", Toast.LENGTH_SHORT).show();
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                            Log.e("anyText", response);
                            Toast.makeText(SignUp_Activity.this, "ERROR CREATING ACCOUNT....!!"+e.toString(), Toast.LENGTH_SHORT).show();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(SignUp_Activity.this, "REGISTER FAIL..........!!", Toast.LENGTH_SHORT).show();
                    }
                }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("name", name);
                params.put("email", email);
                params.put("password", password);
                return params;
            }
        };

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }
}

我在上面的代码上有错误,还写了有这个错误的地方

我的php代码:

**

<?php if ($_SERVER['REQUEST_METHOD'] =='POST'){

$name = $_POST['name'];
$email = $_POST['email'];
$password = $_POST['password'];

$password = password_hash($password, PASSWORD_DEFAULT);

require_once 'connect.php';

$sql = "INSERT INTO users_table (name, email, password) VALUES ('$name', '$email', '$password')";

if ( mysqli_query($conn,$sql) ) {
    $result["success"] = "0";
    $result["message"] = "success";

    echo json_encode($result);
    mysqli_close($conn);

}
else {

    $result["success"] = "1";
    $result["message"] = "error";

    echo json_encode($result);
    mysqli_close($conn);
}}?>

我认为 myphp 代码很好,但是在上面的 android 代码中有一个我不明白的错误。

尝试将类型请求更改为 json 对象

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
        (Request.Method.POST, URL_REGIST, null, new Response.Listener<JSONObject>() {

    @Override
    public void onResponse(JSONObject response) {

并更改requestQueue.add(stringRequest); requestQueue.add(jsonObjectRequest); 希望这有帮助

编辑:你可以这样改变

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
        (Request.Method.POST, URL_REGIST, new Response.Listener<JSONObject>() {
                //Getting error here//  new Response.Listener<String>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d("RESPONSE",response.toString())
                        try {
                            //Getting error here//   JSONObject jsonObject = new JSONObject(response);
                            String success = response.getString("success");

                            if (success.equals("0")) {
                                progressDialog.dismiss();
                                Toast.makeText(SignUp_Activity.this, "REGISTER SUCCESS......!!", Toast.LENGTH_SHORT).show();
                            }
                            else {
                                Toast.makeText(SignUp_Activity.this, "EMAIL ALREADY EXISTS...!!", Toast.LENGTH_SHORT).show();
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                            Log.e("anyText", response);
                            Toast.makeText(SignUp_Activity.this, "ERROR CREATING ACCOUNT....!!"+e.toString(), Toast.LENGTH_SHORT).show();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(SignUp_Activity.this, "REGISTER FAIL..........!!", Toast.LENGTH_SHORT).show();
                    }
                }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("name", name);
                params.put("email", email);
                params.put("password", password);
                return params;
            }
        };

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(jsonObjectRequest);

查看堆栈跟踪、异常消息以及 Android JSONObject 和 JSON 类的源代码,很明显您正在使用字符串“Database”作为参数调用new JSONObject 那是失败的......自然。

response字符串似乎不是您认为的那样。 您应该能够通过在尝试解码之前记录response的值来确认这一点。

(注意:注释掉的代码使您不确定您在 Java 端实际运行的是什么。我假设您正在调用new JSONObject(String) ......但它被注释掉了。您的堆栈跟踪和代码不匹配。类似地,我对 PHP 代码表示怀疑……因为我看不出它是如何生成“数据库”作为响应的。)

可能有更优雅的方法来处理响应 -> JSON 转换(请参阅其他答案),但我认为真正的问题是您得到的响应不是有效的 JSON ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM