【问题标题】:JSONException: Value <br of type java.lang.String cannot be converted to JSONObjectJSONException:Java.lang.String 类型的值 <br 无法转换为 JSONObject
【发布时间】:2014-06-25 16:37:07
【问题描述】:

我努力寻找解决方案,但仍然无法解决。请帮忙。这是我的java代码:-

public class MainActivity extends Activity {

String project_id;
String id;
InputStream is=null;
String result=null;
String line=null;
int code = 0;

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   final EditText e_id      =(EditText) findViewById(R.id.editText1);
   final EditText e_prjId   =(EditText) findViewById(R.id.editText2);
   Button insert            =(Button) findViewById(R.id.button1);

   id           = e_id.getText().toString();
   project_id   = e_prjId.getText().toString();
   insert.setOnClickListener(new View.OnClickListener() {
       public void onClick(View v) {
           insert();

       }
   });
   }

   public void insert() {
   final ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

   nameValuePairs.add(new BasicNameValuePair("id",id));
   nameValuePairs.add(new BasicNameValuePair("Project_Id",project_id));


   new Thread(new Runnable() {
       public void run() {
           try {

                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://192.168.0.111/insert.php");

                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost); 
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
                Log.e("pass 1", "connection success ");
           }
           catch(Exception e){
                Log.e("Fail 1", e.toString());
                Toast.makeText(getApplicationContext(), "Invalid IP Address",
                Toast.LENGTH_LONG).show();
           }  

           try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();

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

                is.close();
                result = sb.toString();
                Log.e("pass 2", "connection success ");
            }
            catch(Exception e){
                Log.e("Fail 2", e.toString());
            }    

           try {
               Log.i("tagconvertstr", "["+result+"]");
               JSONObject json_data  = new JSONObject(result);
               code=(json_data.getInt("code"));
           } catch (JSONException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
           }    

           if(code==1)
           {
               Toast.makeText(getBaseContext(), "Inserted Successfully",Toast.LENGTH_SHORT).show();
           }
           else
           {
               Toast.makeText(getBaseContext(), "Sorry, Try Again",Toast.LENGTH_LONG).show();
           }
       }
   }).start();



}

php:-

<?php
$uname='root';
$pwd='';


$con =  new PDO("mysql:host=192.168.0.111;dbname=wktask", $uname, $pwd);


$ID=$_REQUEST['ID'];
$Project_Id=$_REQUEST['Project_Id'];

$flag['code']=0;

if($r= $con->query("insert into task(ID,Project_Id) values('$ID','$Project_Id')"))
{
    $flag['code']=1;
}

echo(json_encode($flag));

?>

我真的不知道我不断收到来自 JSON 异常错误的错误消息的原因是什么。真的很感谢 somemore 可以帮助我。

谢谢

【问题讨论】:

  • 原因是:您试图将 html 字符串转换为 JSONObject。所以你的变量 result 很可能不是有效的 json 格式。
  • so @user3776060 你有没有在下面尝试我的答案?
  • 嗨@dognose,谢谢你的评论,你是对的。请问如何让结果返回有效的json格式值?
  • 嗨@meda,非常感谢您的评论和回答。我试过了,但它返回一个错误消息“致命错误:调用未定义的方法 PDO::execute()”。有什么建议吗?

标签: java php json pdo


【解决方案1】:

小心,PHP 关联数组区分大小写

您正在发送id:

nameValuePairs.add(new BasicNameValuePair("id",id));

不等于ID

除了那个错误,你没有检查你的php脚本中的数据,我给你重写了:

$data = array();

if(isset($_POST['id'], $_POST['Project_Id']){
    $id=$_POST['id'];
    $project_id=$_POST['Project_Id'];

    $uname='root';
    $pwd='';
    $con =  new PDO("mysql:host=192.168.0.111;dbname=wktask", $uname, $pwd);
    $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $stmt = $con->prepare('INSERT INTO task (`ID`, `Project_Id`) values(:id, :project_id)'))
    $success = $stmt->execute(array(':id'=>$id, ':project_id'=>$project_id));

    if($success){
       $data['code'] = 1;
       $data['msg'] = 'INSERT successful';
    }else{
       $data['code'] = 0;
       $data['msg'] = 'INSERT Failed';
    }


}else{
    $data['code'] = 0;
    $data['msg'] = 'values are not set';
}

echo(json_encode($data));

【讨论】:

  • 嗨@meda,在我将$success = $con-&gt;execute(array(':id'=&gt;$id, ':project_id'=&gt;$project_id)); 更改为$st = $con-&gt;prepare('INSERT INTO task (ID, Project_Id) values(:id, :project_id)'); $success = $st-&gt;execute(array(':id'=&gt;$id, ':project_id'=&gt;$project_id)); 后,您的代码运行良好。
  • 嗨@meda,在我将$success = $con-&gt;execute(array(':id'=&gt;$id, ':project_id'=&gt;$project_id)); 更改为$st = $con-&gt;prepare('INSERT INTO task (ID, Project_Id) values(:id, :project_id)'); $success = $st-&gt;execute(array(':id'=&gt;$id, ':project_id'=&gt;$project_id)); 后,您的代码运行良好。当我设法得到返回结果 [{"code":1,"msg":"INSERT successful"}。但我面临一个新问题,它指出**无法在未调用 Looper.prepare() 的线程内创建处理程序。有什么建议吗?
  • @user3776060 那是因为你试图在正在运行的线程中显示一个 toast,它应该在主线程(UI)上,但我建议你使用 asyntask,作为一个更好的解决方案
猜你喜欢
  • 2020-03-08
  • 2017-01-10
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
相关资源
最近更新 更多