Ciągle pojawia się komunikat „Uncaught SyntaxError: Nieoczekiwany token o”

306

Próbuję nauczyć się html / css / javascript, więc piszę sobie projekt dydaktyczny.

Chodziło o to, aby w pliku json znaleźć trochę słownictwa, które następnie załadowano do tabeli. Udało mi się załadować plik i wydrukować jedną z jego wartości, po czym zacząłem pisać kod, aby załadować wartości do tabeli.

Po zrobieniu tego zacząłem pojawiać się błąd, więc usunąłem cały kod, który napisałem, pozostawiając mi tylko jedną linię (tę samą linię, która działała wcześniej) ... tylko błąd nadal istnieje.

Błąd jest następujący:

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

Mój kod javascript jest zawarty w osobnym pliku i jest po prostu następujący:

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);
    });
}

A mój plik JSON ma teraz następujące:

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

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

Teraz błąd jest zgłaszany w linii 11, która jest var glacier = JSON.parse(data);linią.

Kiedy usuwam plik json, pojawia się błąd: „GET http: //.../wokab.json 404 (Not Found)”, więc wiem, że go ładuje (a przynajmniej próbuje).

Bjorninn
źródło
5
$ .get może rozpoznać json po jego wysłaniu, stąd. var glacier = data;powinno wystarczyć.
roselan
46
Podsumowując: próbujesz to przeanalizować dwa razy.
fiatjaf
Zobacz także stackoverflow.com/a/42907459/632951
Pacerier
Mam podobne, Uncaught SyntaxError: Unexpected token Iponieważ koduje Pythonjson.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
Bob Stein

Odpowiedzi:

314

Wygląda na to, że jQuery zgaduje typ danych. Parsuje JSON, nawet jeśli nie wywołujesz getJSON () - wtedy, gdy próbujesz wywołać JSON.parse () na obiekcie, pojawia się błąd.

Dalsze wyjaśnienia można znaleźć w odpowiedzi Adityi Mittal .

ek_ny
źródło
13
Aha, więc dane [0]. Angielski zwraca „worek”. Wygląda na to, że wcale nie muszę analizować pliku json.
Bjorninn,
1
to ciekawe .. Chyba jquery zgaduje typ danych i zakłada, że ​​to json. Sądzę, że getJson też by działał, prawda?
ek_ny 10.11.11
87
Mała uwaga: jeśli jesteś JSON.parseobiektem, „Nieoczekiwany token o” jest rzucany po prostu dlatego, że próbuje on parsować obj_to_parse.toString(), to znaczy [object Object]. Spróbuj JSON.parse('[object Object]');;)
Pier Paolo Ramon
22
Zdarzyło mi się również, myślę, że mój błąd polegał na tym, że próbowałem przeanalizować z JSON coś, co już było obiektem JSON
Wak
2
jQuery nie zgaduje . Jeśli nie przesłonisz go za pomocą dataType(cokolwiek, dlaczego), użyje Content-typenagłówka HTTP odpowiedzi w celu ustalenia, jakie to dane, i przeanalizuje je, jeśli jest to takie, które rozpoznaje jQuery.
Quentin,
76

Problem jest bardzo prosty

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

Przetwarzasz to dwa razy. getużywa dataType='json', więc dane są już w formacie json. Służy $.ajax({ dataType: 'json' ...do ustawiania zwracanego typu danych!

Andrius Bentkus
źródło
54

Zasadniczo, jeśli nagłówek odpowiedzi to text / html, musisz go przeanalizować, a jeśli nagłówek odpowiedzi to application / json, jest on już dla Ciebie parsowany.

Przetwarzane dane z procedury obsługi sukcesu jquery dla odpowiedzi text / html:

var parsed = JSON.parse(data);

Przetwarzane dane z procedury obsługi sukcesu jquery dla odpowiedzi aplikacji / json:

var parsed = data;
Aditya Mittal
źródło
6
Uwaga dla każdego, kto głosuje w dół, zaakceptowana odpowiedź powyżej zawiera dokładną kopię tej odpowiedzi. Dodawanie linku z zaakceptowanej odpowiedzi teraz.
Geoffrey Hale,
11

Kolejne wskazówki dotyczące Unexpected tokenbłędów. Istnieją dwie główne różnice między obiektami javascript a json:

  1. Dane json należy zawsze podawać w cudzysłowie.
  2. klucze muszą być cytowane

Prawidłowy JSON

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

Błąd JSON 1

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

Błąd JSON 2

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

Uwaga

To nie jest bezpośrednia odpowiedź na to pytanie. Ale to odpowiedź na Unexpected tokenbłędy. Może więc pomóc innym, którzy natkną się na to pytanie.

Matthias M.
źródło
2

Po prostu odpowiedź jest już przeanalizowana, nie trzeba jej ponownie analizować. jeśli ponownie go przeanalizujesz, otrzymasz „nieoczekiwany token”, jednak musisz określić typ danych we wniosku, aby był typudataType='json'

Muhammad Soliman
źródło
1

Miałem teraz podobny problem i moje rozwiązanie może pomóc. Korzystam z iframe, aby przesłać i przekonwertować plik xml do json i odesłać go z powrotem za kulisy, a Chrome dodawał śmieci do przychodzących danych, które pojawiały się tylko sporadycznie i powodowały błąd „Uncaught SyntaxError: Nieoczekiwany token o” błąd.

Uzyskiwałem dostęp do danych iframe w następujący sposób:

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

który działał dobrze na localhost, ale kiedy przesłałem go na serwer, przestał działać tylko z niektórymi plikami i tylko podczas ładowania plików w określonej kolejności. Naprawdę nie wiem, co to spowodowało, ale to naprawiło. Zmieniłem powyższą linię na

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

kiedy zauważyłem śmieci w odpowiedzi HTML.

Krótka historia sprawdź swoje nieprzetworzone dane odpowiedzi HTML, a możesz coś podkręcić.

Brandon
źródło
Ok dzięki. O dziwo, czasami wydaje się, że odbiera już przeanalizowany obiekt json, a czasem nie. Nie miałem czasu na kontynuowanie projektu, więc nie wiem, czy losowo to zrobi (w zależności od przeglądarek i systemów lub czegoś takiego). Dzięki za wskaźnik, będę o tym pamiętać.
Bjorninn
1
SyntaxError: Unexpected token o in JSON

Dzieje się tak również wtedy, gdy zapomnisz użyć awaitsłowa kluczowego dla metody zwracającej dane JSON.

Na przykład:

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

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

zgłosi błąd z powodu braku await. Rzeczywiście zwracany jest Promise[obiekt], a nie string.

Aby to naprawić, po prostu dodaj czekaj, jak należy:

var json_str = await returnJSONData();

Powinno to być dość oczywiste, ale błąd jest wywoływany JSON.parse, więc łatwo przeoczyć, jeśli istnieje pewna odległość między awaitwywołaniem metody a JSON.parsewywołaniem.

Obinwanne Hill
źródło
0

Upewnij się, że plik JSON nie zawiera żadnych końcowych znaków przed ani po nim. Może nie do wydrukowania? Możesz spróbować w ten sposób:

[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]
thexebolud
źródło
1
JSON.parse ('[{"english": "bag", "kana": "kaban", "kanji": "K"}, {"english": "okulary", "kana": "megane", " kanji ":" M "}] '); Działa w porządku. ¿Czy próbowałeś zastąpić ten wiersz alertem (danymi), aby sprawdzić, czy plik ładuje się poprawnie?
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());

Gdy tempActivity pobiera dane, które powodują błąd „Błąd składni: nieoczekiwany token o w JSON w pozycji 1 - Przepełnienie stosu”

VISHAL KUMAR
źródło