Я продовжую отримувати "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 (не знайдено)", тому я знаю, що він завантажує його (або принаймні намагається).


5
$ .get може розпізнати json, коли він надсилається. var glacier = data;повинно вистачити
roselan

46
Підводячи підсумки: ви намагаєтесь проаналізувати його двічі.
fiatjaf


Я отримав подібне Uncaught SyntaxError: Unexpected token Iтому, що кодує Pythonjson.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
Боб Штейн

Відповіді:


314

Схоже, jQuery здогадується про тип даних. Це робить аналіз JSON, навіть якщо ви не викликаєте getJSON () - тоді, коли ви намагаєтесь викликати JSON.parse () на об'єкт, ви отримуєте помилку.

Подальше пояснення можна знайти у відповіді Адітії Міттал .


13
Ага, так що дані [0] .english повертає "сумку". Схоже, мені взагалі не потрібно розбирати файл json.
Bjorninn

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-typeзаголовок HTTP відповіді, щоб визначити, що це за дані, і аналізує їх, якщо jQuery розпізнає.
Квентін

76

Проблема дуже проста

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

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


54

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

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

var parsed = JSON.parse(data);

Проаналізовані дані з обробника успіху jquery для відповіді application / 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

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


1

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

Я отримував доступ до таких даних iframe:

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

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

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

одного разу я помітив трохи сміття у відповіді HTML.

Короткий короткий опис, перевірте свої вихідні дані відповіді HTML, і ви можете щось вимкнути.


Добре, дякую. Як не дивно, іноді здається, що отримує вже проаналізований об'єкт json, а іноді ні. Я не встиг продовжити проект, тому не знаю, чи буде це робити випадковим чином (залежно від браузерів і систем чи чогось). Дякую за вказівник, я пам’ятаю про це.
Bjorninn

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, тому легко пропустити, якщо між вашим викликом методу та викликом є деяка відстань .awaitJSON.parse


0

Переконайтесь, що у вашому файлі JSON немає жодних символів до або після. Може, недрукований? Ви можете спробувати так:

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

1
JSON.parse ('[{"english": "сумка", "kana": "kaban", "kanji": "K"}, {"english": "келихи", "kana": "megane", " kanji ":" M "}] '); Добре працює. ¿Чи спробували ви замінити цей рядок на попередження (дані), щоб перевірити, чи файл завантажується правильно?
thexebolud

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.