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).
źródło
var glacier = data;
powinno wystarczyć.Uncaught SyntaxError: Unexpected token I
ponieważ koduje Pythonjson.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
Odpowiedzi:
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 .
źródło
JSON.parse
obiektem, „Nieoczekiwany token o” jest rzucany po prostu dlatego, że próbuje on parsowaćobj_to_parse.toString()
, to znaczy[object Object]
. SpróbujJSON.parse('[object Object]');
;)dataType
(cokolwiek, dlaczego), użyjeContent-type
nagłówka HTTP odpowiedzi w celu ustalenia, jakie to dane, i przeanalizuje je, jeśli jest to takie, które rozpoznaje jQuery.Problem jest bardzo prosty
Przetwarzasz to dwa razy.
get
używadataType='json'
, więc dane są już w formacie json. Służy$.ajax({ dataType: 'json' ...
do ustawiania zwracanego typu danych!źródło
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:
Przetwarzane dane z procedury obsługi sukcesu jquery dla odpowiedzi aplikacji / json:
źródło
Kolejne wskazówki dotyczące
Unexpected token
błędów. Istnieją dwie główne różnice między obiektami javascript a json:Prawidłowy JSON
Błąd JSON 1
Błąd JSON 2
Uwaga
To nie jest bezpośrednia odpowiedź na to pytanie. Ale to odpowiedź na
Unexpected token
błędy. Może więc pomóc innym, którzy natkną się na to pytanie.źródło
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ł typu
dataType='json'
źródło
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:
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
kiedy zauważyłem śmieci w odpowiedzi HTML.
Krótka historia sprawdź swoje nieprzetworzone dane odpowiedzi HTML, a możesz coś podkręcić.
źródło
Dzieje się tak również wtedy, gdy zapomnisz użyć
await
słowa kluczowego dla metody zwracającej dane JSON.Na przykład:
zgłosi błąd z powodu braku
await
. Rzeczywiście zwracany jestPromise
[obiekt], a niestring
.Aby to naprawić, po prostu dodaj czekaj, jak należy:
Powinno to być dość oczywiste, ale błąd jest wywoływany
JSON.parse
, więc łatwo przeoczyć, jeśli istnieje pewna odległość międzyawait
wywołaniem metody aJSON.parse
wywołaniem.źródło
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:
źródło
Gdy tempActivity pobiera dane, które powodują błąd „Błąd składni: nieoczekiwany token o w JSON w pozycji 1 - Przepełnienie stosu”
źródło