Я продолжаю получать «Uncaught SyntaxError: Неожиданный токен o»

275

Я пытаюсь изучить некоторые html/css/javascript, поэтому я пишу сам учебный проект.

Идея заключалась в том, чтобы иметь некоторый словарь, содержащийся в json файле, который затем будет загружен в таблицу. Мне удалось загрузить файл и распечатать одно из его значений, после чего я начал писать код для загрузки значений в таблицу.

После этого я начал получать ошибку, поэтому я удалил весь написанный мной код, оставив мне только одну строку (ту же строку, что и раньше)... только ошибка все еще существует.

Ошибка следующая:

Uncaught SyntaxError: Unexpected token o
(anonymous function)script.js:10
jQuery.Callbacks.firejquery-1.7.js:1064
jQuery.Callbacks.self.fireWithjquery-1.7.js:1182
donejquery-1.7.js:7454
jQuery.ajaxTransport.send.callback

Мой код javascript содержится в отдельном файле, и это просто:

function loadPageIntoDiv(){
    document.getElementById("wokabWeeks").style.display = "block";
}

function loadWokab(){
    //also tried getJSON which threw the same error
    jQuery.get('wokab.json', function(data) {
        var glacier = JSON.parse(data);
    });
}

И мой JSON файл имеет прямо сейчас следующее:

[
    {
        "english": "bag",
        "kana": "kaban",
        "kanji": "K"
    },

    {
        "english": "glasses",
        "kana": "megane",
        "kanji": "M"
    }
]

Теперь об ошибке сообщается в строке 11, которая является строкой var glacier = JSON.parse(data);.

Когда я удаляю json файл, я получаю сообщение об ошибке: "GET http://.../wokab.json 404 (Not Found)", поэтому я знаю, что загружаю его (или, по крайней мере, пытаться).

  • 5
    $ .get может распознать json при отправке, следовательно. var glacier = data; должно хватить.
  • 45
    Подводя итог: вы пытаетесь разобрать его дважды.
Показать ещё 1 комментарий
Теги:

7 ответов

275
Лучший ответ

Похоже, что jQuery угадывает тип данных. Он обрабатывает JSON, даже если вы не вызываете getJSON() - тогда, когда вы пытаетесь вызвать JSON.parse() для объекта, вы получаете ошибку.

Дальнейшее объяснение можно найти в Ответ Aditya Mittal.

  • 0
    Почему это тогда? Может ли человек, который проголосовал за это, тоже объяснить?
  • 13
    Ага, поэтому data [0] .english возвращает «bag». Похоже, мне вообще не нужно разбирать файл json.
Показать ещё 8 комментариев
73

Проблема очень проста

jQuery.get('wokab.json', function(data) {
    var glacier = JSON.parse(data);
});

Вы разбираете его дважды. get использует dataType='json', поэтому данные уже в формате json. Используйте $.ajax({ dataType: 'json' ..., чтобы установить тип возвращаемых данных!

31

В принципе, если заголовок ответа - text/html, вам нужно разобрать, и если заголовок ответа - application/json, он уже разобран для вас.

Разработанные данные из обработчика успеха jquery для ответа text/html:

var parsed = JSON.parse(data);

Разработанные данные из обработчика успеха jquery для ответа приложения /json:

var parsed = data;
  • 6
    Примечание для тех, кто проголосует против, принятый ответ содержит точную копию этого ответа. Добавление ссылки из принятого ответа сейчас.
6

Другие подсказки для ошибок Unexpected token. Существуют два основных различия между объектами javascript и json:

  • Данные json всегда указываются с двойными кавычками.
  • должны быть указаны

Исправить JSON

 {
    "english": "bag",
    "kana": "kaban",
    "kanji": "K"
}

Ошибка JSON 1

 {
    'english': 'bag',
    'kana': 'kaban',
    'kanji': 'K'
 }

Ошибка JSON 2

 {
    english: "bag",
    kana: "kaban",
    kanji: "K"
}

Примечание

Это не прямой ответ на этот вопрос. Но это ответ на ошибки Unexpected token. Таким образом, это может помочь другим, которые наткнулись на этот вопрос.

2

Просто ответ уже разобран, вам не нужно снова его анализировать. если вы снова проанализируете его, он даст вам "неожиданный токен o", однако вы должны указать тип данных в своем запросе как тип dataType='json'

1

У меня была аналогичная проблема только сейчас, и мое решение могло бы помочь. Я использую iframe для загрузки и преобразования xml файла в json и отправки его обратно за кулисы, а Chrome добавлял некоторые мусорные данные к входящим данным, которые отображались только периодически, и вызывают "Uncaught SyntaxError: Неожиданный токен o", ошибка.

Я обращался к данным iframe следующим образом:

$('#load-file-iframe').contents().text()

который отлично работал на локальном хосте, но когда я загрузил его на сервер, он переставал работать только с некоторыми файлами и только при загрузке файлов в определенном порядке. Я действительно не знаю, что вызвало это, но это зафиксировало это. Я изменил строку выше на

$('#load-file-iframe').contents().find('body').text()

как только я заметил некоторый мусор в ответе HTML.

Длинная история коротко проверит ваши необработанные данные ответа HTML, и вы можете что-то сделать.

  • 0
    Хорошо спасибо. Странно, но иногда кажется, что получен уже проанализированный объект json, а иногда нет. У меня не было времени продолжить проект, поэтому я не знаю, будет ли он делать это случайно (в зависимости от браузеров и систем или чего-то еще). Спасибо за указатель, я буду иметь это в виду.
0

Убедитесь, что ваш JSON файл не имеет никаких завершающих символов до или после. Может быть, непечатный? Вы можете попробовать таким образом:

[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]
  • 1
    JSON.parse ( '[{ "английский": "мешок", "кан": "Кабан", "кандзи": "К"}, { "английские": "очки", "кан": "Megane",» кандзи ":" М "}] '); Работает отлично. ¿Вы пытались заменить эту строку предупреждением (данными), чтобы проверить, правильно ли загружается файл?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню