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


306

Я пытаюсь изучить 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;должно хватить.
— roselan

46
Подводя итог: вы пытаетесь разобрать его дважды.
— Пятница,


Я получил подобное, Uncaught SyntaxError: Unexpected token Iпотому что Python кодируетjson.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
— Боб Стейн

Ответы:


314

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

Дальнейшее объяснение можно найти в ответе Адитьи Миттала .


13
Ага, поэтому data [0] .english возвращает «bag». Похоже, мне совсем не нужно разбирать файл json.
— Бьорнин

1
это интересно .. Я предполагаю, что jquery предполагает тип данных и предполагает, что это json. Я бы подумал, что getJson сработает и тогда, верно?
— ek_ny

87
Небольшое примечание: если вы JSON.parseобъект, «неожиданный токен o» выбрасывается просто потому, что он пытается разобрать obj_to_parse.toString(), что есть [object Object]. Попробуйте JSON.parse('[object Object]');;)
— Пьер Паоло Рамон

22
Это случилось и со мной, я думаю, что моя ошибка заключалась в том, что я пытался разобрать в JSON то, что уже было объектом JSON
— Wak

2
JQuery не догадывается . Если вы не переопределяете его dataType(каким-либо образом, почему), он использует Content-typeHTTP-заголовок ответа, чтобы определить, к какому типу данных это относится, и анализирует его, если он распознает jQuery.
— Квентин

76

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

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

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


54

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

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

var parsed = JSON.parse(data);

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

var parsed = data;

6
Примечание для тех, кто проголосует против, принятый ответ содержит точную копию этого ответа. Добавление ссылки из принятого ответа сейчас.
— Джеффри Хейл

11

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

  1. Данные JSON всегда должны быть заключены в двойные кавычки.
  2. ключи должны быть указаны

Правильный 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

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


1

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

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

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

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

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

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

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


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

1
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.

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

var json_str = await returnJSONData();

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


0

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

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

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

0
const getCircularReplacer = () => {
              const seen = new WeakSet();
              return (key, value) => {
                if (typeof value === "object" && value !== null) {
                  if (seen.has(value)) {
                    return;
                  }
                  seen.add(value);
                }
                return value;
              };
            };
JSON.stringify(tempActivity, getCircularReplacer());

Где tempActivity извлекает данные, что приводит к ошибке «SyntaxError: Неожиданный токен o в JSON в позиции 1 - переполнение стека»

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.