如何使用json对象数组生成有效的json输出

时间:2018-03-14 11:59:35

标签: php json

我在本地服务器上用phpMyAdmin创建了一个mySQL数据库。在这个数据库中,我存储了我的朋友的名字和位置(以及id作为数据库的主键)。我编写并运行以下php脚本从数据库中检索这些数据并将它们投影到我的本地Web服务器(XAMPP)上:

<?php

$dbServername = 'localhost';
$dbUsername = 'root';
$dbPassword = '';
$dbName = 'Friends';

$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);

header('Content-Type: application/json');

$sql = 'SELECT * FROM friends;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);

if ($resultCheck > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        echo json_encode($row, JSON_PRETTY_PRINT);

    }
}

然而,通过这种方式我得到了这个输出:

{
    "id": "1",
    "name": "David Belton",
    "location": "New Haven"
}{
    "id": "2",
    "name": "Alex Danson",
    "location": "New York"
}

整体上不是有效的json输出。 我想得到以下输出:

[{
        "id": "1",
        "name": "David Belton",
        "location": "New Haven"
    }, {
        "id": "2",
        "name": "Alex Danson",
        "location": "New York"
  }]

(这也是一个有效的json输出)

我该怎么做?

4 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为你在循环中将每个对象与其他对象隔离开来。

while ($row = mysqli_fetch_assoc($result))
    echo json_encode($row, JSON_PRETTY_PRINT); //<-- echo out an isolated JSON object

相反,只需将所有内容存储在一个数组中,直到完成后再回显JSON一次,而不是迭代。

$arr = [];
while ($row = mysqli_fetch_assoc($result)) $arr[] = $row;
json_encode($arr, JSON_PRETTY_PRINT);

答案 1 :(得分:1)

创建一个数组并在while循环中推送这些记录。最后echo json_encode();所以输出将采用正确的JSON格式

$records = array();
if ($resultCheck > 0) {
    while ($row = mysqli_fetch_assoc($result)) {

        $records[] = $row;
    }
}
echo json_encode($records, JSON_PRETTY_PRINT);

答案 2 :(得分:1)

将结果存储在数组中,然后回显编码/格式化数组:

<?php

$dbServername = 'localhost';
$dbUsername = 'root';
$dbPassword = '';
$dbName = 'Friends';

$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);

header('Content-Type: application/json');

$sql = 'SELECT * FROM friends;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);

$arr = array();

if ($resultCheck > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        array_push($arr, $row);
    }
}

echo json_encode($arr, JSON_PRETTY_PRINT);

答案 3 :(得分:1)

或者,不要逐个获取结果,只需使用mysqli_fetch_all

即可
if ($resultCheck > 0)
{
    $row = mysqli_fetch_all($result);
    echo json_encode($row, JSON_PRETTY_PRINT);
}

实际上更快并且使用更少的内存:http://php.net/manual/en/mysqli-result.fetch-all.php