如何使用php生成json响应

时间:2012-02-27 09:53:15

标签: php json zend-framework

如何使用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"
   }
]

2 个答案:

答案 0 :(得分:2)

我建议您按原样使用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结果创建树结构的其他问题。

答案 1 :(得分:1)

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

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就能做到。