Uncaught SyntaxError: Неожиданный токен ::

В моем приложении я получаю Uncaught SyntaxError: Unexpected token: при использовании getJSON для получения JSON с сервера.

Это javascript, который я использую:

$('#employeeListPage').bind('pageinit', function(event) {
    getEmployeeList();
});

setInterval ( "getEmployeeList()", 10000 );
var vanhadata = "";

function getEmployeeList() {
    $.getJSON(serviceURL + 'getemployees.php?autonumero=' + autonumero + 'callback=?', function(data) {
       if(JSON.stringify(data) != JSON.stringify(vanhadata)){ 
            $('#employeeList li').remove();
            employees = data.key;
            $.each(employees, function(index, employee) {
                $('#employeeList').append('<li><a href="keikka.html?id=' + employee.IND + '">' +
                    '<h4>' + employee.OSO + '</h4>' +
                    '<img src="pics/' + employee.TILA + '.png"/>' +
                    '<p>' + employee.AIKA + '</p>' +'</a></li>');
        });
            $('#employeeList').listview('refresh');

            if(vanhadata != "")
               alert("Uusia keikkoja!");       
            vanhadata = data;
        }
    });
}  

Ответ JSON от сервера кажется правильным, но он показывает ошибку, и данные не отображаются. Консоль также печатает: "Resource interpreted as Script but transferred with MIME type text/html:"

Это ответ JSON:

{
    "key": [
        {
            "NIMET": "Tuntematon",
            "PERHJAS": "0",
            "SAATTAJA": "0",
            "m_yht": "0",
            "OSO": null,
            "AIKA": "2010-03-11 10:00:00",
            "OSOITELAJI": "0",

        }
    ]
}UncaughtSyntaxError: Unexpectedtoken: 

И getemployees.php:

<?php
 header('Content-Type: application/json; charset=UTF-8');

include 'config.php'; 

$number = $_GET['autonumero'] ;

$sql = "select * from table where number=\"$number\"";



try {
    $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);  
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $dbh->query($sql);  
    $employees = $stmt->fetchAll(PDO::FETCH_OBJ);
    $dbh = null;
    echo '{"key":'. json_encode($employees) .'}'; 
} catch(PDOException $e) {
    echo '{"error":{"text":'. $e->getMessage() .'}}'; 
}


?>

При изменении файла PHP на:

           if ($_GET['callback'])
        print $_GET['callback']."(";

    echo '{"key":'. json_encode($results) .'}';  

  if ($_GET['callback'])
        print ")"; 

} catch(PDOException $e) {
    echo '{"error":{"text":'. $e->getMessage() .'}}'; 
}

Я получаю ответ:

<br />
<font size='1'><table class='xdebug-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Parse error: syntax error, unexpected T_CATCH in C:\Services\getemployees.php on line <i>40</i></th></tr>
</table></font>

Так что это вообще не JSON.


person user1323294    schedule 09.05.2012    source источник
comment
попробуйте запустить JSON в валидаторе. А можно текст ответа выложить?   -  person Joseph    schedule 09.05.2012
comment
JSON недействителен для Internet Explorer.   -  person Andrew Leach    schedule 09.05.2012


Ответы (2)


Неожиданный токен — это не :, это пробел после : в этом сообщении.

Вам нужно удалить последнюю запятую в вашем внутреннем объекте. Internet Explorer, в частности, возражает против этих завершающих запятых: кажется, что запятая означает «Что-то еще впереди», тогда как другие браузеры используют запятую для обозначения «Это конец этого».

Поскольку вы используете json_encode, это должно обрабатываться автоматически, поэтому вы можете передавать ему неверные данные. Проверьте данные, возвращенные вашим запросом: возможно, есть пустая строка?

person Andrew Leach    schedule 09.05.2012
comment
Пробел между <?php и header ничего не даст, пробел должен быть перед <?php. - person Dagg Nabbit; 09.05.2012
comment
пустых строк вроде нет - person user1323294; 09.05.2012
comment
@user1323294 user1323294 Что-то заставляет json_encode помещать пустую строку между последней запятой и }. Это могут быть только данные. Мое предположение о пустой строке было только предположением, потому что я не знаю, что это за данные. - person Andrew Leach; 09.05.2012

Заставьте ваш getemployees.php печатать тип контента application/json вместо обычного текста

person Reza S    schedule 09.05.2012
comment
У меня есть header('Content-Type: application/json; charset=UTF-8'); в файле PHP. Это удаляет Resource, интерпретируемый как Script, но переданный с MIME-типом text/html: part, но он по-прежнему показывает Uncaught SyntaxError: Unexpected token : - person user1323294; 09.05.2012
comment
проблема связана с вашим скриптом getemployees.php, а не с javascript. Вы можете вставить код для этого? - person Reza S; 09.05.2012
comment
Эй, чувак, посмотри на этот ответ: stackoverflow.com/a/10412923/196917 похоже на твой тип проблемы. Если это решит, дайте ему голос - person Reza S; 09.05.2012
comment
Я новичок в PHP, поэтому я действительно не знаю, как изменить свой код, чтобы он работал так. Не могли бы вы предоставить мне пример кода? - person user1323294; 09.05.2012
comment
Вы видите, где он проверяет if ($_GET['callback']) { print $_GET['callback']."("; } - person Reza S; 09.05.2012
comment
просто добавьте эти два оператора if вокруг того места, где вы печатаете строку json. т.е. оберните вашу строку json в эту штуку jQuery17209314005577471107_1335958194322({JSONSTRING}) - person Reza S; 09.05.2012
comment
давайте продолжим это обсуждение в чате - person user1323294; 09.05.2012