如何使用php生成json响应


How to generate json response using php

如何使用php 生成json响应

在模型中:

public function groups($getGroupId) {
        $cols = array('group_id','name');
        $sql = $this->select ()
                    ->from ( $this->_name, $cols )
                    ->where ( 'parent_id=?', $getGroupId );
        $groupDetails = $this->fetchAll ( $sql );
        //$childGroupName = $groupDetails['name'];
        return $groupDetails;
}

groupDetails.php页面:

$dbGroup = new dbGroups();
$groupDetails = $dbGroup -> groups($getGroupId);
$jsonResponse = json_encode($groupDetails);
print_r($jsonResponse);

当打印数据时,我得到了类似的响应

[{"group_id":"2","name":"ABCD"},{"group_id":"7","name":"XYZ"}]  

但我想要这样的输出,因为我必须使用json 生成一个jstree

[
   {
      "data" : {
         "icon" : <optional>,
         "title" : <node name>
      },
      "attr" : {
         "rel" : <the type you defined in the js (maybe "group")>,
         "title" : <node title>,
         "id" : <the node's id / group id>
      },
      "state" : "closed"
   }
]

我建议您按原样使用json_encode的输出。占用更少的带宽。我看到所有空白的唯一原因是为了调试,因此我宁愿在FireFox中使用FireBug和/或JSONView。

无论如何,如果你真的想,你可以试试JSON_PRETTY_PRINT标志?这似乎是在5.4.0中添加的,所以可能你所在的版本不支持它…不过,在那里的评论中似乎有一些选项可以使用。也许你能找到有用的东西?http://www.php.net/manual/en/function.json-encode.php#102091


你说你现在必须创建一个jstree,而这与你的要求无关。你是两个数据看起来根本不一样的例子。json_encode不做任何特殊或神奇的事情。它只是获取数据并将其转换为JSON。你的工作是在对数据进行编码之前,首先让数据看起来正确。你的DB查询很可能会返回一组平面行,你必须循环遍历它,并以某种方式生成你想要的树。你可能会在这里找到其他关于如何从平面DB结果创建树结构的问题。

由于您使用的是Zend Framework,我建议您使用Zend_Json。Zend_Json是一个非常有用的组件,用于从格式化Json,任何支持的格式(对象、数组、xml…)

Zend_Json::decode()Zend_Json::encode()将允许您对Json进行编码和解码,prettyPrint()用于使您的输出更美观。


编辑:正如Svish所说,你的两个例子看起来不一样,所以很难猜测你想在树里放什么。

您需要的是创建您自己的数组,这样您就可以使它看起来像您想要的那样。

例如,假设你只想在树中的数据库中有一行,那么你的数组应该是这样的:

$v = array(
       array(
         "data" => array("icon" => "ICON",
                         "title" => $row->name),
         "attr" => array("rel" => "REL",
                         "title" => "TITLE", 
                         "id" => $row->group_id),
          "state" =>     "closed"));
echo Zend_Json::encode($v);

这些线条应该与你的例子相呼应。

要使其与fetchAll()配合使用,只需简单的foreach即可。