Ответ 1
response
уже проанализирован, вам не нужно его снова анализировать.
Если вы снова проанализируете его, он сначала выполнит команду toString-cast, чтобы вы разобрали
"[object Object]"
который объясняет unexpected token o
.
Я просмотрел все SO и Google, но заметил, что это помогло, и я не уверен, как продолжить. У меня есть массив, который я возвращаю с 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]
но я продолжаю получать 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;
//
}
это мой метод обслуживания:
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
, я получаю Object, поэтому я попробовал 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;
}
теперь я получаю 1
для console.log("data " + data[0]);
, как и ожидалось, но я получаю для console.log(month);
Я получаю [object Object]
для console.log(month.promise)
Я получаю [object Object]
и для console.log(month.promise[0]);
получаю undefined
response
уже проанализирован, вам не нужно его снова анализировать.
Если вы снова проанализируете его, он сначала выполнит команду toString-cast, чтобы вы разобрали
"[object Object]"
который объясняет unexpected token o
.
Пожалуйста, посмотрите главу "Преобразование запросов и ответов" $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
Это было разрешено с помощью @CuongLe здесь путем замены
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;
});
Если отправлен заголовок:
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);
}