我已经看过SO和谷歌,但已经注意到它有所帮助,我不确定如何继续。我有一个数组,我使用echo json_encode()
从php页面返回,如下所示:
[" "," "," "," "," ",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]
但是当我在使用JQuery交替时尝试使用JSON.parse()和Unexpected token o at Object.parse (native)
时,我不断获得Unexpected token o at Function.parse (native)
。
但是当我将它附加到$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;
//
}
这是我的服务方法:
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:
<?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
我得到了对象,那么我按照一些答案here中的建议尝试了var monthDays = Array.prototype.slice.call(response)
和var monthDays = $.map(response, function (value, key) { return value; });
,我也尝试过{ {1}}但我只是得到JSON.stringify()
作为结果
我真的很沮丧,真的需要有人指出我正确的方向
我认为这可能是使用{}
的问题,因为我更新了我的getMonth方法,如下所示:
$q.defer()
现在我得到了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("data " + data[0]);
我获得了console.log(month);
[object Object]
我获得了console.log(month.promise)
[object Object]
我得到console.log(month.promise[0]);
答案 0 :(得分:64)
response
已经过解析,您无需再次解析它。
如果再次解析它,它将首先执行toString-cast,以便你解析
"[object Object]"
解释了unexpected token o
。
答案 1 :(得分: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
答案 2 :(得分:1)
在@CuongLe here的帮助下,通过替换
解决了这个问题 response = memberFactory.getMonth("2013-08-01 06:30:00");
var monthDays = $.parseJSON(response);
使用:
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;
});
答案 3 :(得分:1)
如果发送标题:
Content-Type: text/json
然后不需要调用parseJSON()
。例如:
在PHP中,我会像这样设置标题:
<?php
header("Content-Type: text/json");
echo json_encode(array("someKey" => "someValue"));
在Javascript中,我会为成功函数提供类似的东西:
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);
}