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

jon*_*nie 27 javascript angularjs

我已经看过SO和谷歌,但已经注意到这有帮助,我不确定如何继续.我有一个数组,我从一个PHP页面返回使用echo json_encode(),如下所示:

[" "," "," "," "," ",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]
Run Code Online (Sandbox Code Playgroud)

但是Unexpected token o at Object.parse (native)当我尝试使用JSON.parse()并且Unexpected token o at Function.parse (native)当我使用JQuery交替时,我不断得到.

但是当我把它附加到$scope我可以在页面上打印出来的时候,那么我做错了什么,我怎么能纠正这个?

这是我的控制器

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;
    //
}
Run Code Online (Sandbox Code Playgroud)

这是我的服务方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

这是我的PHP:

<?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); ?>
Run Code Online (Sandbox Code Playgroud)

我试过的事情

如果我返回typeof我得到的对象,那么我已经尝试了,var monthDays = Array.prototype.slice.call(response)并且var monthDays = $.map(response, function (value, key) { return value; });在这里的一些答案中建议,我也尝试了JSON.stringify()但是我得到{}了结果

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

更新

我相信这可能是一个问题,$q.defer()因为我更新了我的getMonth方法,如下所示:

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;
}   
Run Code Online (Sandbox Code Playgroud)

现在我得到1的console.log("data " + data[0]);预期,但我得到了console.log(month);我得到[object Object]了console.log(month.promise)我得到[object Object]和console.log(month.promise[0]);我得到undefined

Hal*_*yon 63

response 已经解析,您不需要再次解析它.

如果再次解析它,它将首先执行toString-cast,以便您进行解析

"[object Object]"
Run Code Online (Sandbox Code Playgroud)

这解释了unexpected token o.


zs2*_*020 6

请看看一章转化请求和响应的的$ HTTP模块.

如果检测到JSON响应,则使用JSON解析器对其进行反序列化.

由于它已经被解析为JSON对象,如果再次解析它,您将得到该错误.

这是一个简单的测试:

response = '{"a": "a","b": "b"}';
var obj = $.parseJSON(response);
console.log(obj); //Object {a: "a", b: "b"} 
$.parseJSON(obj)  //Uncaught SyntaxError: Unexpected token o 
Run Code Online (Sandbox Code Playgroud)