如何正确获取JSONArray项?

时间:2017-12-01 15:10:57

标签: php android arrays json

我有一个php文件,我从数据库中检索数据,然后将其转换为数组,然后对其进行编码,因此我正在开发的Android应用程序获取JSONArray解析它,并获取数据。

这是php文件:

<?php

$response = array();

// include db connect class
require_once __DIR__ . '/db_connect.php';

// connecting to db
$db = new DB_CONNECT();
$dbh = $db->connect(); // here you get the connection

$query = "SELECT *FROM lost_pets";

$result = $dbh->prepare($query);
$result->execute();

if ($result->fetchAll() > 0) {
     foreach($dbh->query($query) as $row){
        $pet["id"] = $row['id'];
        $pet["name"] = $row['name'];
        $pet["breed"] = $row['breed'];

        $response["pet"] = array($pet);
        echo json_encode($response);
     }
}
?>

结果如下:

{"pet":[{"id":"1","name":"Prueba","breed":"Yorkshire Terrier"}]}{"pet":[{"id":"2","name":"Prueba2","breed":"German Shepherd"}]}{"pet":[{"id":"3","name":"Prueba3","breed":"Beagle"}]}

问题是,当我在Android中检索JSONObject并执行getJSONArray()时,而不是给我3个数组,我只是得到了上面的结果。

我真的对PHP没有很好的理解,但是根据php文档,我看不出我做错了什么。 我非常接近完成应用程序,这是我现在无法解决的唯一一个大问题,这真的让我心烦意乱。谢谢!

编辑: JSONParser

else if(method.equals("GET")){
        // request method is GET

        if (sbParams.length() != 0) {
            url += "?" + sbParams.toString();
        }

        try {
            urlObj = new URL(url);
            conn = (HttpURLConnection) urlObj.openConnection();
            conn.setDoOutput(false);
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept-Charset", charset);
            conn.setConnectTimeout(15000);
            conn.connect();
            is = conn.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + '\n');
            }
            is.close();
            json = sb.toString();
            System.out.println(json.toString() + "This is the json");
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

//             try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }catch (NullPointerException ex){
            System.out.println("No internet");
        }

        return jObj;

    }

    conn.disconnect();
    return jObj;
}

3 个答案:

答案 0 :(得分:2)

你需要array_push,其中$ pet被推入数组并打印该数组。 使用中,

<?php
 $arr=array();
 foreach($dbh->query($query) as $row){
    $pet["id"] = $row['id'];
    $pet["name"] = $row['name'];
    $pet["breed"] = $row['breed'];
    $response["pet"] = array_push($arr,$pet); 
 }

 print_r($arr);

?>

答案 1 :(得分:1)

你需要对最终的数组结构进行一次编码,你的循环中的编码最终导致无效的json,因为你将有多个连接的json字符串。

最简单的方法是只选择你想要的字段:

$query = "SELECT id, name, breed FROM lost_pets";

$result = $dbh->prepare($query);
$result->execute();

echo json_encode($result->fetchAll(PDO::FETCH_ASSOC));
exit;

如果你需要一个petpets密钥,你可能需要一个循环,但你可以一次分配行;无需分配单个字段。

答案 2 :(得分:1)

我在我的所有应用程序中使用了以下函数来从php&amp;获取数据json数组。试试这个。

public void ParseJsonArray(json){ //json is the json array you got. pass it to this function. this can get specific data from json array.

try {
        JSONArray jsonArray = json.getJSONArray("pet"); //get all data
        int count = 0;

//if you have more columns & you want to get specific columns.   
        while (count<jsonArray.length()){

            JSONObject JO = jsonArray.getJSONObject(count); //get data row by row.
            String s1 = JO.getString("id"); //get id value to string s1. 
            String s2 = JO.getString("name"); //get name to string s2. 
            String s3 = JO.getString("breed"); //get breed to string s3.            
            count++;        }

    } catch (JSONException e) {
        e.printStackTrace();  }
    }