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

Я пытаюсь изучить некоторые 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)", поэтому я знаю, что загружаю его (или, по крайней мере, пытаться).

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

var parsed = JSON.parse(data);

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

var parsed = data;

Ответ 4

Другие подсказки для ошибок 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. Таким образом, это может помочь другим, которые наткнулись на этот вопрос.

Ответ 5

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

Ответ 6

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

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

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

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

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

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

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

Ответ 7

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

[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]

Ответ 8

SyntaxError: Unexpected token o in JSON

Это также происходит, когда вы забыли использовать ключевое слово await для метода, который возвращает данные JSON.

Например:

async function returnJSONData()
{
   return "{\"prop\": 2}";
}

var json_str = returnJSONData();
var json_obj = JSON.parse(json_str);

выдаст ошибку из-за пропущенного await. На самом деле возвращается Promise [объект], а не string.

Чтобы исправить, просто добавьте await, как вы должны:

var json_str = await returnJSONData();

Это должно быть довольно очевидно, но ошибка вызывается в JSON.parse, поэтому легко пропустить, если есть некоторое расстояние между вызовом метода await и вызовом JSON.parse.