在Codeigniter中更改json_encode的输出

时间:2013-09-15 20:06:59

标签: php codeigniter

我正在这样的控制器中从MySQL数据库输出JSON格式的数据,

function byId(){
        $this -> load -> model('usermodel');
        $data['user'] = $this -> usermodel -> getById($this->uri->slash_segment(3));
        $this -> output -> set_content_type('application/json');
        $this -> output -> set_output(json_encode($data));
    }

型号:

function getById($id){
        $this->db->select('*');
        $this->db->from('members');
        $this->db->where('id', $id);

        $q = $this -> db -> get();

        if ($q -> num_rows() > 0) {
            foreach ($q->result() as $row) {
                $data[] = $row;
            }
            return $data;
        }

    }

它输出这样的数据,

{"user":[{"id":"3","firstname":"Frances","lastname":"Johnson","address":"489 Summit Lane","state":"Minnesota","country":"US","email":"fjohnson@teklist.net","phone":null,"experience":"2","designation":"Script"}]}

但我需要这样,

{user : {....} }

基本上我想摆脱方括号。

我可以在代码中更改哪些内容以获得预期的输出?

2 个答案:

答案 0 :(得分:1)

您在个人"用户"周围看到额外[]的原因对象是因为$data[]方法中的getById()数组。您将返回一个包含其他数组的数组,默认情况下json_encode会将数字索引数组(从0开始)转换为javascript数组。

现在取决于你的意图。如果你想返回一个用户列表,即使它有一个元素但强制包含各个用户对象的列表作为json输出中的对象,你可以使用JSON_FORCE_OBJECT选项,如:

json_encode($data, JSON_FORCE_OBJECT);

但是从您的代码判断,您只想返回实际的用户对象而不是它的列表,因此您可以修改getById()方法以在db结果上返回->row()的方法,或者您可以使用以下方法获取从方法返回的第一个对象:

...->getById(...)[0]; // for php 5.4+

 reset(...->getById()); // for older versions

答案 1 :(得分:0)

尝试替换

$data['user'] = $this -> usermodel -> getById($this->uri->slash_segment(3));

用这个

$data['user'] = $this -> usermodel -> getById($this->uri->slash_segment(3))[0];

[{ ... }]是一个包含单个对象的数组。 [0]应该抓住该数组中的第一个元素而不是数组本身。