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
org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
提问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 JSONObject
call 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-Type
header 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 print
to echo
尝试在打印之前阻止任何输出并将其更改print
为echo
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 中输入它就会告诉你什么是问题