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

Bjorninn
источник
5
$ .get может распознать json при отправке, следовательно. var glacier = data;должно хватить.
roselan
46
Подводя итог: вы пытаетесь разобрать его дважды.
Пятница,
Также см stackoverflow.com/a/42907459/632951
Pacerier
Я получил подобное, Uncaught SyntaxError: Unexpected token Iпотому что Python кодируетjson.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
Боб Стейн

Ответы:

314

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

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

ek_ny
источник
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, и вы можете что-то включить.

Brandon
источник
Хорошо, спасибо. Как ни странно, иногда кажется, что получен уже разобранный объект 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вызовом.

Obinwanne Hill
источник
0

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

[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]
thexebolud
источник
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 - переполнение стека»

ВИШАЛ КУМАР
источник