cakephp json解析错误

时间:2013-09-13 12:02:45

标签: json jquery cakephp cakephp-2.0

我有一个ajax调用,让json返回但是我得到一个解析错误。它看起来不错,不确定cakephp设置中缺少什么。

{"member":{"Member":{"total_points":"18"}}}

SyntaxError:无效标签

错误在第一个引号

Cakephp 2.0

jQuery 1.9.1

jQuery代码:

$('document').ready(function() {
    $.ajax({
        url: 'http://mydomian.com/loyalty/members/api/5749.json',
        dataType: 'jsonp',
        success: function(response) {
            console.log(resonse);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(jqXHR, textStatus, errorThrown);
        }
    });
});

我原来在views / members / json / api.ctp中没有文件,我现在得到了同样的错误我在文件中有这个代码。

<?php echo $callback; ?>(<?php echo json_encode($member) ?>);

MembersController.php

public function api($mem_id = null) {
    $options = array(
        'fields' => array('Member.total_points'),
        'conditions' => array('Member.member_no' => $mem_id),
        'recursive' => -1
    );
    $members = $this->Member->find('first', $options);
    $this->set(array(
        'member' => $members,
        '_serialize' => array('member')
    ));
}

我已将json放入http://jsonlint.com/并且已经回来了

enter image description here

1 个答案:

答案 0 :(得分:0)

JSONP请求,即跨域请求需要正确的JSONP响应,这是一个函数调用,传递给它的JSON数据:

functionName({"key":"value"});

默认情况下,函数名由jQuery自动定义,但可以使用jsonpCallback option覆盖。此名称作为参数传递给给定的URL,因此AJAX请求将如下所示:

http://mydomian.com/loyalty/members/api/5749.json?callback=FunctionName...

顺便说一句,你可以在你添加的图片中看到生成的函数名称,在错误中显示Error: jQuery... was not called

因此,您必须使用请求中传递的函数名称构建正确的响应。这需要使用视图文件,因此您必须抛弃JsonView提供的自动序列化。

在你的控制器中,不要设置_serialize视图var,而只设置member var和jQuery提交的回调查询值:

$this->set(array(
    'member' => $members,
    'callback' => $this->request->query['callback']
));

然后在.ctp视图文件中输入数据,使其以函数调用的格式,使用$callback作为函数名称:

<?php echo $callback; ?>(<?php echo json_encode($member) ?>);

响应将如下所示:

jQuerySomeRandomNumbersHere({"member":{"Member":{"total_points":"18"}}});