如何解析 PHP 脚本接收到的 JSON 数据

Posted

技术标签:

【中文标题】如何解析 PHP 脚本接收到的 JSON 数据【英文标题】:How to parse a JSON data that has been received by a PHP scipt 【发布时间】:2019-09-10 02:51:15 【问题描述】:

我已经使用 `json_encode' 函数从我的 php 脚本发送了数据。

如果我 console.log(resp) 下面是我得到的 O/P。

data: ""dept_name":"IT","city_name":"Mumbai","emp_id":"#AC001","emp_name":"Akshay S. Shrivastav" 
 "dept_name":"IT","city_name":"Mumbai","emp_id":"#AC003","emp_name":"Aakash Shrivastav"" status: "success"

但是,如果我 console.log(resp.data) 我得到以下数据

"dept_name":"IT","city_name":"Mumbai","emp_id":"#AC001","emp_name":"Akshay S. Shrivastav""dept_name":"IT","city_name":"Mumbai","emp_id":"#AC003","emp_name":"Aakash Shrivastav"

现在我正在尝试在使用以下代码的数据表中显示这些数据。

$('#grpList').DataTable().row.add([
        resp.data.dept_name,
        resp.data.city_name,
        resp.data.emp_id,
        resp.data.emp_name
   ]).draw(false);

我收到以下错误

DataTables warning: table id=grpList - Requested unknown parameter '0' for row 0, column 0. For more information about this error, please see http://datatables.net/tn/4

当我单手显示 console.log(resp.data.dept_name) 时,它会显示 undefined

如果数据增加,我将收到多个 JSON 响应,目前我只有两个。我无法弄清楚如何使用循环显示多个数据并将其附加到数据表中。

我正在使用下面的 php 代码来生成 JSON

$jsonArray = "";
if($data->num_rows > 0)
    
        while($row = $data->fetch_assoc())
            
                $jsonArray .=   json_encode(
                                                array(
                                                        "dept_name" => $row['department_name'],
                                                        "city_name" => $row['city_name'],
                                                        "emp_id" => $row['emp_id'],
                                                        "emp_name" => $row['name']
                                                     ));
            

        echo json_encode(array("data" => $jsonArray, "status" => 'success'));
    

【问题讨论】:

正如下面 Jack Bashford 的回答所说... json 看起来像一个对象数组... 即使对象之间没有昏迷 ... 这里可能只是一个错字...否则你会使它成为无效的json。在这种情况下,请查看服务器端以解决该问题。此外,即使您在服务器端使用json_encode(),也可能会收到一个字符串...试试JSON.parse() JSON.parse 说Unexpected token o in JSON at position 1 显示如何在服务器端创建该 json...o 可能是接收到的字符串中“object”的第一个字母。这意味着你不需要解析它......但我不确定。 PS:更新问题 【参考方案1】:

因为resp.data 是一个对象数组。您需要先获取索引 - 比如说索引0,或者数组中的第一个对象:

$("#grpList").DataTable().row.add([
  resp.data[0].dept_name,
  resp.data[0].city_name,
  resp.data[0].emp_id,
  resp.data[0].emp_name
]).draw(false);

如果你想要第二个对象:

$("#grpList").DataTable().row.add([
  resp.data[1].dept_name,
  resp.data[1].city_name,
  resp.data[1].emp_id,
  resp.data[1].emp_name
]).draw(false);

当然,row.add() 也接受数组参数 - 所以这也可以:

$("#grpList").DataTable().row.add(resp.data).draw(false);

【讨论】:

还是同样的错误。 PS我已经修改了问题,以便您也可以看到实际的数组而没有任何隔离。 第一个代码在使用@Louys Patrice Bessette 修改后的 PHP 脚本后工作。但是,$("#grpList").DataTable().row.add(resp.data).draw(false); 不接受resp.dataresp.data[0]。你能建议我一个替代解决方案吗?【参考方案2】:

问题出在服务器端。

您将$jsonArray 定义为字符串!错了。

试试这个:

$jsonArray = [];  // An ARRAY here!
if($data->num_rows > 0)

  while($row = $data->fetch_assoc())
  
  array_push($jsonArray, json_encode(  // Use array_push here
    array(
      "dept_name" => $row['department_name'],
      "city_name" => $row['city_name'],
      "emp_id" => $row['emp_id'],
      "emp_name" => $row['name']
    ));
  

  echo json_encode(array("data" => $jsonArray, "status" => 'success'));

编辑 如果上述方法有效,我不知道......因为我没有测试它。 但我是这样写的(我猜你会有更多的机会)

$jsonArray = [];
if($data->num_rows > 0) 
  while($row = $data->fetch_assoc()) 

    // A temp array to rename the one of the keys...
    $tempArray = [];
    $tempArray = ["dept_name"] = $row['department_name'];
    $tempArray = ["city_name"] = $row['city_name'];
    $tempArray = ["emp_id"] = $row['emp_id'];
    $tempArray = ["emp_name"] = $row['name'];

    // Push to the jsonArray now...
    array_push($jsonArray,$tempArray);
  

  // And finally the result array... To be json encoded
  $result = [];
  $result = ["status"] = "success";
  $result = ["data"] = jsonArray;
  echo json_encode($result);

请注意,如果不重命名一个键,并且如果数据库中每行只有 4 个数据...您可以直接完成 array_push($jsonArray,$row);,而不使用 $tempArray

所以试试这个... AND 然后应用 Jack 的答案。 ;)

【讨论】:

临时数组工作得很好,然后杰克的代码工作了。 :)

以上是关于如何解析 PHP 脚本接收到的 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IOS 上使用 Swift 解析 JSON,从 PHP 服务脚本发送?

Android:如何让我检索到的(来自 mysql)JSON 解析数据添加到 ListView 每分钟刷新一次

JAVA基础-JSON

如何解析从 Datatables ajax 调用收到的 JSON?

java Httpserver 传递过来的json里面的汉字 接收到的每个汉字对应一个问号“?” 请问该如何解决这个问题

接收json有上万条数据,怎么用Python优化解析