Android org.json.JSONException: 类型 java.lang.String 的值不能转换为 JSONObject

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10376645/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 03:26:46  来源:igfitidea点击:

org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject

phpandroidmysqljson

提问by Karly

I m trying to do a registration page from an android activity connectiong the datas to my sqldatabase, I m getting this error " org.json.JSONException: Value

我正在尝试从 android 活动连接到我的 sqldatabase 的数据进行注册页面,我收到此错误“org.json.JSONException: Value

First of all, could anyone advise me on how to debug my program when using an mysql database with php script for an android application ? Cause I usually use the log cat but here the errors aren't as clear :S ...

首先,有人可以建议我在将 mysql 数据库与 php 脚本用于 android 应用程序时如何调试我的程序吗?因为我通常使用日志猫,但这里的错误不太清楚:S ...

Here is the activity code :

这是活动代码:

public class Subscribe extends Activity {

    Button bSubscribe;
    EditText etPwdSub, etPwdConf, etLoginSub, etNameSub, etFnSub;
    String result = null;
    InputStream is = null;
    String donnees = "";

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.subscribe);

        etLoginSub = (EditText) findViewById(R.id.etLoginSub);
        etPwdSub = (EditText) findViewById(R.id.etPwdSub);
        etPwdConf = (EditText) findViewById(R.id.etPwdConf);
        etNameSub = (EditText) findViewById(R.id.etNameSub);
        etFnSub = (EditText) findViewById(R.id.etFnSub);

        bSubscribe = (Button) findViewById(R.id.bSubscribe);        
        bSubscribe.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                Pattern p = Pattern.compile(".+@.+\.[a-z]+");
                Matcher m = p.matcher(etLoginSub.getEditableText());

                if (m.matches() == false) {

                    Toast.makeText(
                            getBaseContext(),
                            "Le champs email ne correspond pas au format d'une adresse mail",
                            Toast.LENGTH_SHORT).show();
                } else {

                    // autre méthode : etPwdSub.equals("")
                    if (etPwdSub.getEditableText() != null
                            && etPwdConf.getEditableText() != null
                            && etNameSub.getEditableText() != null
                            && etFnSub.getEditableText() != null) {

                        if (etPwdSub.getEditableText().toString().equals(etPwdConf.getEditableText().toString())) {

                            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

                            nameValuePairs.add(new BasicNameValuePair("login", etLoginSub.getText().toString()));
                            nameValuePairs.add(new BasicNameValuePair("pwd", etPwdConf.getText().toString()));
                            nameValuePairs.add(new BasicNameValuePair("name", etNameSub.getText().toString()));
                            nameValuePairs.add(new BasicNameValuePair("firstname", etFnSub.getText().toString()));                          

                            try {
                                // commandes httpClient
                                HttpClient httpclient = new DefaultHttpClient();


                                HttpPost httppost = new HttpPost(
                                        "http://192.168.1.101/spotnshare/subscribe.php");

                                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                                HttpResponse response = httpclient.execute(httppost);

                                HttpEntity entity = response.getEntity();
                                is = entity.getContent();

                            } catch (Exception e) {
                                Log.i("taghttppost", "" + e.toString());
                                Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG)
                                        .show();
                            }

                            try {
                                BufferedReader reader = new BufferedReader(new InputStreamReader(
                                        is, "UTF-8"));

                                StringBuilder sb = new StringBuilder();

                                String line = null;

                                while ((line = reader.readLine()) != null) {
                                    sb.append(line + "\n");
                                }

                                is.close();

                                result = sb.toString();
                            } catch (Exception e) {
                                Log.i("tagconvertstr", "" + e.toString());
                            }

                            try {
                                JSONObject jObj = new JSONObject(result);

                                    donnees = jObj.getString("message");

                                    Intent ourIntent = new Intent(Subscribe.this,
                                            SubscribeMess.class);

                                    // objet qui vas nous permettre de passe des variables ici la
                                    // variable passInfo
                                    Bundle objetbunble = new Bundle();          
                                    objetbunble.putString("message", donnees);
                                    ourIntent.putExtras(objetbunble);               // on passe notre objet dans l'intent

                                    // on appelle notre activité
                                    startActivity(ourIntent);                                   

                            } catch (JSONException e) {
                                Log.i("tagjsonexp", "" + e.toString());
                            } catch (ParseException e) {
                                Log.i("tagjsonpars", "" + e.toString());
                            }


                        } else {
                            Dialog d = new Dialog(Subscribe.this);
                            d.setTitle(etPwdSub.getEditableText() +" "+etPwdConf.getEditableText());
                            d.show();
                        }

                    } else {
                        Dialog d = new Dialog(Subscribe.this);
                        d.setTitle("Fill in all the fields !");
                        d.show();
                    }

                }
            }
        });

    }

    protected void onPause() {
        super.onPause();
        finish();
    }
}

and here is the php script :

这是 php 脚本:

<?php

if( isset($_POST['login']) && isset($_POST['pwd']) && isset($_POST['name']) && isset($_POST['firstname'])) {

    include("connexion_bdd.php");

    if(connexionBDD() == 1){

        $login = $_POST['login'];
        $pwd = $_POST['pwd'];
        $name = $_POST['name'];
        $firstname = $_POST['firstname'];

        $sql = "SELECT colUserID
                FROM userTable 
                WHERE colUserLogin = '".$login."' ";

        $req = mysql_query($sql);
        $resultat=mysql_num_rows($req); 

        if($resultat==0){
            $temps = time();
            $clef = md5($login . $temps);

            $req = mysql_query("INSERT INTO userTable(colUserLogin, colUserPwd, colUserName, colUserFirstname, colUserKey, colUserDate)
                                        VALUES( '$login', '$pwd', '$name', '$firstname', '$clef', '$temps')");

            if($req){
                    $destinataire = $login;
                    $sujet ="Welcome on SnSR";
                    $from = "From: [email protected] \r\n";
                    $from .= "Content-Type: text/html; charset=us-ascii\r\n";

                    $message = ' Clic on the link below :<br/>
                    <a href="http://localhost/spotnshare/validation_mail.php?usrk='.$clef.' ">
                        Registration confirmation.
                    </a> ';

                    ini_set('SMTP','relay.skynet.be');

                    if(mail($destinataire,$sujet,$message,$from)){
                        $msg = 'Check your mailbox to activate your account !'; 
                    }           
                    else{
                        $msg = 'Problem sending you the activation mail !'; 
                        $req = mysql_query("DELETE FROM userTable WHERE colUserLogin = '".$pseudo."' ");
                    }
            }
            else{
                $msg = 'Problem inserting you in our database !';
            }
        }else{
                $msg = 'This email has already been used !';
        }
        mysql_free_result ($req);   

    }else{
        $msg = "Connexion problem with de DB"
        print(json_encode(array("message" => $msg)));       
    }

}else{
        $msg = "Couldn't treat your datas"
}

print(json_encode(array("message" => $msg)));

?>

回答by Femi

Your request to http://192.168.1.101/spotnshare/subscribe.phpis failing and returning a non-JSON string (probably a PHP error). You can print out the value with a

您对http://192.168.1.101/spotnshare/subscribe.php 的请求失败并返回非 JSON 字符串(可能是 PHP 错误)。您可以使用 a 打印出该值

Log.i("tagconvertstr", "["+result+"]");

Log.i("tagconvertstr", "["+result+"]");

before the new JSONObjectcall to see what you're getting before parsing it.

new JSONObject调用之前查看你在解析它之前得到了什么。

EDIT: if you are using Eclipse you can set a break point and step through to see what's going on.

编辑:如果您使用的是 Eclipse,您可以设置一个断点并逐步查看发生了什么。

回答by Karly

Thanks I manage to correct some of the errors 2 ';' were missing and I could see the error with Log.i("tagconvertstr", "["+result+"]");

谢谢我设法纠正了一些错误 2 ';' 丢失了,我可以看到错误 Log.i("tagconvertstr", "["+result+"]");

The msg that it is showing is something like that :

它显示的消息是这样的:

[<br/ > font size = 1 table class=''xdebug-erroe' dir='ltr' ... loads of html code that wasn't in my initial code then....{"message":"Problem sending you the activation mail !"}]

[<br/ > font size = 1 table class=''xdebug-erroe' dir='ltr' ... loads of html code that wasn't in my initial code then....{"message":"Problem sending you the activation mail !"}]

So there's a problem with the json format on that message "Problem sending you the activation mail" but the user was registered OK!

因此,该消息“向您发送激活邮件时出现问题”上的 json 格式存在问题,但用户已注册 OK!

So the second time i would try that code it would show me in a correct json format : "This email has already been used" ! (without any errors) but i still can't find the error in my php code : S

因此,我第二次尝试该代码时,它会以正确的 json 格式向我显示:“此电子邮件已被使用”!(没有任何错误)但我仍然无法在我的 php 代码中找到错误:S

回答by Abhishek Jain

You should set Content-Typeheader before sending back the response.

您应该Content-Type在发回响应之前设置标头。

header('Content-Type: application/json');
print(json_encode(array("message" => $msg)));

Check this : Returning JSON from a PHP Script

检查这个:从 PHP 脚本返回 JSON

回答by Yaron U.

try preventing any output before your print and change the printto echo

尝试在打印之前阻止任何输出并将其更改printecho

you may also remove the closing ?>to prevent further output after the php script

您也可以删除关闭?>以防止在 php 脚本之后进一步输出

<?php
ob_start();
if( isset($_POST['login']) && isset($_POST['pwd']) && isset($_POST['name']) && isset($_POST['firstname'])) {

    include("connexion_bdd.php");

    if(connexionBDD() == 1){

        $login = $_POST['login'];
        $pwd = $_POST['pwd'];
        $name = $_POST['name'];
        $firstname = $_POST['firstname'];

        $sql = "SELECT colUserID
                FROM userTable 
                WHERE colUserLogin = '".$login."' ";

        $req = mysql_query($sql);
        $resultat=mysql_num_rows($req); 

        if($resultat==0){
            $temps = time();
            $clef = md5($login . $temps);

            $req = mysql_query("INSERT INTO userTable(colUserLogin, colUserPwd, colUserName, colUserFirstname, colUserKey, colUserDate)
                                        VALUES( '$login', '$pwd', '$name', '$firstname', '$clef', '$temps')");

            if($req){
                    $destinataire = $login;
                    $sujet ="Welcome on SnSR";
                    $from = "From: [email protected] \r\n";
                    $from .= "Content-Type: text/html; charset=us-ascii\r\n";

                    $message = ' Clic on the link below :<br/>
                    <a href="http://localhost/spotnshare/validation_mail.php?usrk='.$clef.' ">
                        Registration confirmation.
                    </a> ';

                    ini_set('SMTP','relay.skynet.be');

                    if(mail($destinataire,$sujet,$message,$from)){
                        $msg = 'Check your mailbox to activate your account !'; 
                    }           
                    else{
                        $msg = 'Problem sending you the activation mail !'; 
                        $req = mysql_query("DELETE FROM userTable WHERE colUserLogin = '".$pseudo."' ");
                    }
            }
            else{
                $msg = 'Problem inserting you in our database !';
            }
        }else{
                $msg = 'This email has already been used !';
        }
        mysql_free_result ($req);   

    }else{
        $msg = "Connexion problem with de DB"
        print(json_encode(array("message" => $msg)));       
    }

}else{
        $msg = "Couldn't treat your datas"
}
ob_end_clean()
echo(json_encode(array("message" => $msg)));

回答by salah shams

I have the same problem; i found the solution the easy way.

我也有同样的问题; 我找到了简单的解决方案。

In Java code just type Log.e("anyText",response);In logCat it will show you what is problem

在 Java 代码中,只需Log.e("anyText",response);在 logCat 中输入它就会告诉你什么是问题