关于javascript:使用$ .parseJSON()和JSON.parse()导致“Uncaught SyntaxError:Unexpected token o”的原因是什么

What is causing “Uncaught SyntaxError: Unexpected token o” with $.parseJSON() and JSON.parse()

本问题已经有最佳答案,请猛点这里访问。

我到处都是这样和谷歌,但也注意到这有帮助,我不确定如何继续。我有一个数组,我使用echo json_encode()从一个PHP页面返回它,如下所示:

1
["","","","","",1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]

但是当我尝试使用json.parse()时,我总是得到Unexpected token o at Object.parse (native),当我使用jquery alternive时,得到Unexpected token o at Function.parse (native)

但是当我把它附在$scope上时,我可以用在页面上打印出来,那么我做错了什么,我该怎么纠正呢?

这是我的控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function myController($scope, memberFactory) {

    response = memberFactory.getMonth("2013-08-01 06:30:00");
    //$scope.response = response;
    var monthDays = $.parseJSON(response);

    var dates = [];
    for (var i = 0; i < monthDays.length; i++) {
        if (i % 7 == 0) dates.push([]);
        dates[dates.length - 1].push(monthDays[i]);
    }
    $scope.dates = dates;
    //
}

这是我的服务方式:

1
2
3
4
5
6
7
8
9
10
obj.getMonth = function (date) {
    var month = $q.defer();
    $http.get('getMonth.php?date=' + date)
        .success(function (data, status, headers, config) {
        month.resolve(data);

    });

    return month.promise;
}

这是我的PHP:

1
2
<?php $daysOfMonth=["","","","","",1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];
echo json_encode($daysOfMonth); ?>

我试过的东西

如果我退回typeof号,我就得到了反对意见,所以我试过var monthDays = Array.prototype.slice.call(response)号和var monthDays = $.map(response, function (value, key) { return value; });号,正如这里的一些答案所建议的那样,我也试过JSON.stringify()号,但结果我只得到了{}号。

我真的很沮丧,真的需要有人指点我正确的方向。

更新

我认为这可能是使用$q.defer()的问题,因为我更新了getmonth方法,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
obj.getMonth = function (date) {
    var month = $q.defer();
    $http.get('getMonth.php?date=' + date)
        .success(function (data, status, headers, config) {
        month.resolve(data);
        console.log("data" + data[0]);
        console.log("resolved" + month.promise[0]);

    });

    return month.promise;
}

现在我按预期得到了1,但是我得到了console.log(month);,我得到了[object Object]forconsole.log(month.promise),我得到了[object Object],而对于console.log(month.promise[0]);,我得到了undefined


response已经被解析了,不需要再进行解析。

如果您再次分析它,它将首先执行ToString转换,因此您正在分析

1
"[object Object]"

这就解释了unexpected token o


请看一下转换$http模块请求和响应的章节。

If JSON response is detected, deserialize it using a JSON parser.

因为它已经被解析为JSON对象,如果您再次解析它,您将得到这个错误。

下面是一个简单的测试:

1
2
3
4
response = '{"a":"a","b":"b"}';
var obj = $.parseJSON(response);
console.log(obj); //Object {a:"a", b:"b"}
$.parseJSON(obj)  //Uncaught SyntaxError: Unexpected token o


如果发送了标题:

1
Content-Type: text/json

那么不需要调用parseJSON()。例如:

在一个PHP中,我将像这样设置头部:

1
2
3
<?php
header("Content-Type: text/json");
echo json_encode(array("someKey" =>"someValue"));

在javascript中,对于success函数,我有类似的功能:

1
2
3
4
5
success: function(response) {
// This will output"someValue" to the console.
// Note the lack of the parseJSON() call. parseJSON() is called for us because the header was sent as text/json
console.log(response.someKey);
}

这是在@cuongle的帮助下通过替换

1
2
 response = memberFactory.getMonth("2013-08-01 06:30:00");
 var monthDays = $.parseJSON(response);

用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
response = memberFactory.getMonth("2013-08-01 06:30:00");
response.then(

function (monthDays) {
    console.log("monthDays :" + monthDays +" !!!");

    var dates = [];
    for (var i = 0; i < monthDays.length; i++) {
        if (i % 7 == 0) dates.push([]);
        dates[dates.length - 1].push(monthDays[i]);
    }

    $scope.dates = dates;
});