【问题标题】:How to produce a valid json output with array of json objects如何使用 json 对象数组生成有效的 json 输出
【发布时间】:2018-03-14 11:59:35
【问题描述】:

我在本地服务器中使用 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 输出)

我该怎么做?

【问题讨论】:

    标签: php json


    【解决方案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);
    

    【讨论】:

    • mysqli_fetch_assoc($result) 的结果肯定与$arr 相同,所以可能更简单的解决方案是简单地使用json_encode(mysqli_fetch_assoc($result), JSON_PRETTY_PRINT);?但是 +1 用于解释。
    • 关键是将检索到的关联数组存储在外部数组中,然后对该外部数组进行 JSON 编码。这会产生 OP 想要的输出。
    • 感谢您的回复。也许我希望它不那么密集,但它是正确的,所以没关系。
    【解决方案2】:

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

    <?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】:

      或者,不用逐个获取结果,只需使用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

      【讨论】:

      • 这很酷(点赞)。但是请记住,这将返回一个数组数组,而不是一个简单的数组。
      • 谢谢!没错,这是一个数组数组,但在您接受的答案中,$arr 也是一个数组数组
      • 哈哈,我测试了一下也没意识到……最后我也用了第二个答案……
      【解决方案4】:

      创建一个数组并将这些记录推送到 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);
      

      【讨论】:

        猜你喜欢
        • 2021-05-12
        • 2023-02-25
        • 2016-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        相关资源
        最近更新 更多