Подтвердить что ты не робот

Что вызывает "Uncaught SyntaxError: Неожиданный токен o" с параметрами $.parseJSON() и JSON.parse()

Я просмотрел все 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(), но я просто получил {} в качестве результата

Я действительно расстроен тем, что мне действительно нужно, чтобы кто-то указал мне в правильном направлении

Update

Я считаю, что это может быть проблемой при использовании $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

4b9b3361

Ответ 1

response уже проанализирован, вам не нужно его снова анализировать.

Если вы снова проанализируете его, он сначала выполнит команду toString-cast, чтобы вы разобрали

"[object Object]"

который объясняет unexpected token o.

Ответ 2

Пожалуйста, посмотрите главу "Преобразование запросов и ответов" $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 

Ответ 3

Это было разрешено с помощью @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;
});

Ответ 4

Если отправлен заголовок:

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);
}