1

我正在尝试从我的 android 应用程序中的 MYSQL 数据库返回数据,但是当我运行应用程序时,返回的结果无法转换为 JSON 数组“发生异常说 JSONException:java.lang.String 类型的值无法转换为 JSONArray "

我确保 php 脚本以 JSON 格式返回数据,并且在解析它之前的结果不是 null,它保存返回的数据。为什么会发生此异常以及如何解决?请帮我

这是我的代码:

       private class LoadData extends AsyncTask<Void, Void, String> { 

 private String result = "";
 private InputStream is = null;

 private ProgressDialog progressDialog;



protected void onPreExecute() 
{
       this.progressDialog = ProgressDialog.show(AddFood.this, "","Loading......");  
}

@Override
            protected String  doInBackground(Void... params)
            {
                 MealActivity.foodList = new ArrayList<ItemInList>();     

   try
   {
          ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
         nameValuePairs.add(new BasicNameValuePair("Name",entered_food_Name));
         HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://10.0.2.2/food.php");
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));
       HttpResponse response = httpclient.execute(httppost);
       HttpEntity entity = response.getEntity();
      is = entity.getContent();
       }
   catch(Exception e)
    {
        Log.e("log_tag", "Error in http connection "+e.toString());
      }
//convert response to string
   try{
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),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.e("log_tag", "Error converting result "+e.toString());
        }
   Log.e("log_tag",result+ "result");
    return result;
    }


@Override
protected void onPostExecute(String  result) 
                   {
                              this.progressDialog.dismiss();

    try{
         Log.e("log_tag", " result before parsing " + result);

         String foodName="";
         int Description=0;

         JSONArray jArray = new JSONArray(result);
            JSONObject json_data=null;
            for(int i=0;i<jArray.length();i++)
            {
                json_data = jArray.getJSONObject(i);

             foodName=json_data.getString("Name");
             Description=json_data.getInt("Calories");              
             item.setName(foodName);
             item.setDescription(Description);
             item.setSelected(false);
             MealActivity.foodList.add(item);   
                                                             }

                                                                 }
            catch(JSONException e){
                Log.e("log_tag", "parssing error " + e.toString());
            }   

    }}

这是 php 脚本:

<?php

 $con1=mysql_connect("localhost" , "user","pass" ) ;

 mysql_select_db("MYDB");
 mysql_query("SET NAMES utf8"); 

 $sql=mysql_query("select  Name,Calories  from food where Name LIKE      '%".$_REQUEST['Name']."%' ");

while($row=mysql_fetch_assoc($sql))
$output[]=$row;
$data =json_encode($output);
print($data);
mysql_close();

  ?>

返回数据

  E/log_tag(491):  result before parsing             [{"Name":"\u0627\u0641\u0648\u0643\u0627\u062f\u0648","Calories":"160"}]
4

2 回答 2

2

您可以使用以下方法使您的代码看起来更简单:

String jsonStr = EntityUtils.toString(entity, HTTP.UTF_8);

从实体获取字符串。

'解析'和左大括号之间的这么长的差距看起来很可疑:'[',看起来里面有一些控制字符。这里有一些提示:

  1. 确保您正在使用 ASCII 编码编写 php 文件,可能您的 HTML 编辑器在 .php 文件的开头添加了 BOM 标记。
  2. 确保 <?php 和 ?> 标记之外没有字符
  3. 要验证结果字符串中有哪些坏字符,请将它们作为字节输出到日志中,UTF-8 BOM 如下所示:0xEF,0xBB,0xBF

否则你的 json 解析看起来不错

于 2012-05-07T22:33:27.407 回答
1
$sql=mysql_query("select  Name as name,Calories as cal  from food where Name LIKE      '%".$_REQUEST['Name']."%' ");

只需少量更改,您的问题就会得到解决。

while($row=mysql_fetch_assoc($sql))

$name=$row['name'];

$cal=$row['cal'];

$data1 =json_encode($name);

$data2=json_encode($cal);

print($data1);
print($data2);
于 2012-05-08T07:10:34.720 回答