JSONException索引超出范围[0..1)

时间:2015-06-07 19:11:44

标签: php android mysql json android-volley

我试图通过JSONArray中的Volley从MySql数据库中获取信息。从表中提取行的PHP脚本如下:

<?php
ob_start();
header('Content-Type: application/json');
$con=mysqli_connect("localhost","root","","planet_db");
if (mysqli_connect_errno($con))
{
    //echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$search = $_POST['search'];
//sql query
$query = "SELECT FirstName, LastName, Username FROM users WHERE Username='$search' OR FirstName='$search'";
$result = mysqli_query($con,$query);
$jsonArr = array(array("FirstName"=>"Einie", "LastName"=>" Mini"));
while($row = mysqli_fetch_assoc($result))
{
    array_push($jsonArr,$row);  
}
ob_end_clean();
echo json_encode($jsonArr);
mysqli_close($con);?>

通过HTML页面对localhost上的数据库执行查询的结果如下: user query query result

JSONArray的sencond元素(索引1)如上所示存在但是当我尝试在Android应用程序客户端收到的JSONArray中获取索引1处的元素时,它会抛出一个JSONException:index out of bound [0。 0.1)。类似地,当我在PHP脚本中编辑以下行时:$jsonArr = array(array("FirstName"=>"Einie", "LastName"=>" Mini"));$jsonArr=array();并尝试在索引0处获取JSONArray中的元素,我收到一个JSONException:index out of bound [0..0 )。最后,我无法通过代码添加JSONArray中的任何元素:

while($row = mysqli_fetch_assoc($result))
{
    array_push($jsonArr,$row);  
}

在我的Android应用程序中,它抛出一个JSONException:索引超出绑定但我在localhost上运行它时成功获得了正确的JSON数组。 这是我的Android应用程序代码:

private  void performSearch()
{
    final String url = "http://192.168.42.16/planet/searchPeople.php";
    JsonArrayRequest request = new JsonArrayRequest(Request.Method.POST, url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response)
                {
                    //searchResults.setAdapter(new ResultListAdapter(response, Contents.this));
                    try {
                        Toast.makeText(Contents.this, response.getJSONObject(1).getString("FirstName") + " "
                                + response.getJSONObject(1).getString("LastName"), Toast.LENGTH_LONG).show();
                    } catch (JSONException e)
                    {
                        e.printStackTrace();
                        Toast.makeText(Contents.this,
                            "Error: " + e.getMessage(),
                            Toast.LENGTH_LONG).show();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(Contents.this, error.toString(),Toast.LENGTH_LONG).show();
                }
            })
    {
        @Override
        protected Map<String, String> getParams()
        {
            Map<String, String> map = new HashMap<String, String>();
            map.put("search", query);
            return map;
        }
    };
    MySingleton.getInstance(Contents.this).addToRq(request); // adding request to Volley Request Queue
}

我怎样才能摆脱这种索引超出绑定的JSONException?任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:0)

1)您的网址是本地网址,根据您的网络设置,您可能无法从手机访问该网址。确保您可以通过手机访问该网址。

2)首先,只需尝试在response方法中打印整个onResponse,看看是否获得了所需的JSON。

答案 1 :(得分:0)

1)首先,您确定您的192.168.42.16对网络上的其他设备可见吗?通过尝试在手机上浏览来确保

2)如果成功,请尝试使用Logcat打印出所获得的输出。 [0..1]表示响应中有一个对象,所以只需尝试将其记录为Log.d('JSONTAG',response.toString());