CodeIgniter,无法执行JSON_Encode输出

时间:2012-09-09 22:05:23

标签: json parsing codeigniter decode encode

我很确定我错过了一些简单的东西,无论如何,我在过去三个小时里尝试过JSON编码一些查询结果,我经常使用代码点火器这样做,但是,它只是不起作用,我不明白为什么。

我正在使用CodeIgniter(最新版本),PHP5。

我的三个档案。

material_model MODEL

public function get_types(){
    return $this->db->query("SELECT * FROM material_types ORDER BY type_id")->result_array();
} // end function get_types

public function get_material($name){
    return $this->db->query("SELECT T.name as 'type', M.* FROM material M, material_types T WHERE T.type_id = M.type_id and T.name = '".$name."' ORDER BY M.type_id and M.order")->result_array();
} // end function get_material_all

材料控制器

public function get_all(){
    $json['response'] = array('types' => array());
    $json['response']['types'] = $this->material_model->get_types();


    foreach ($json['response']['types'] as $item){
    $name = $item['name'];

    $json['response'][$name] = $this->material_model->get_material($name);          
    }

    $this->load->view('response', $json);
}

回应视图

$this->output->set_status_header(200);
$this->output->set_header('Content-type: application/json');
echo json_encode($response);

结果 - > http://goethedev.com/iib_ci/index.php/material/get_all/

我用来验证JSON页面的内容 - > http://jsonformatter.curiousconcept.com/

我在那里展示了整个结果,我已经尝试将其缩小到仅仅为了测试目的而只是row_array,只有几个字段来自table material_types,但没有运气,这也是我正在工作的新服务器在这,这不太可能是问题,但我认为值得一提。

感谢。

2 个答案:

答案 0 :(得分:2)

从您提供的URL返回的json正在为我显示,并且它也会验证。要么自发布以来修复了它,要么你需要清除浏览器缓存?

<强>更新

当我将代码复制/粘贴到您提供的验证器时,代码验证正常,但使用URL失败。这告诉我,当从浏览器复制/粘贴时,会出现一些额外/错误的内容。

为了识别它我运行curl http://goethedev.com/iib_ci/index.php/material/get_all/ | less,这就是我得到的:

<U+FEFF><U+FEFF><U+FEFF>{"types":[{"type_id":"0","name":"DISCLAIMER","timestamp":"2012-09-08 22:57:27"},

<U+FEFF>代表byte order mark。由于它们中有三个,因此CI项目中的三个文件中包含字节顺序标记。我建议像PSR2一样,始终禁用PHP代码中的字节顺序标记。您的编辑器应该可以选择删除/禁用它们。一旦你这样做,你应该能够解析json。

答案 1 :(得分:1)

你的json看起来不错,但你也可以试试这个

public function get_all(){
    $response['types'] = $this->material_model->get_types();
    foreach ($response['types'] as $item){
        $response['name'][] = $this->material_model->get_material($item['name']);          
    }
    $this->load->view('response', array($response));
}

在客户端,只需尝试

xhr.onload = function(e){
    var jsonObject = JSON.parse(xhr.responseText);
    if (jsonObject != null)
    {
        console.log(jsonObject); // see in the console if it prints anything
        Ti.API.info(...); // rest of your code
    }
}

If this helps