“Yakalanmamış SyntaxError: Beklenmedik simge o” alıyorum


306

Bazı html / css / javascript öğrenmeye çalışıyorum, bu yüzden kendime bir öğretim projesi yazıyorum.

Fikir, daha sonra bir tabloya yüklenecek bir json dosyasında bulunan bazı kelime bilgilerine sahip olmaktı. Dosyayı yüklemeyi ve değerlerden birini yazdırmayı başardım, daha sonra değerleri tabloya yüklemek için kod yazmaya başladım.

Bunu yaptıktan sonra bir hata almaya başladım, bu yüzden yazdığım tüm kodu kaldırdım, bana sadece bir satır bıraktı (daha önce çalışmış olan aynı satır) ... sadece hata hala orada.

Hata aşağıdaki gibidir:

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 kodum ayrı bir dosyada bulunur ve bu sadece:

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

Ve JSON dosyam şu anda sadece şu özelliklere sahip:

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

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

Şimdi hata, hat olan 11. satırda rapor edilir var glacier = JSON.parse(data);.

Json dosyasını kaldırdığımda hatayı alıyorum: "GET http: //.../wokab.json 404 (Bulunamadı)" bu yüzden yüklediğini biliyorum (veya en azından yapmaya çalışıyorum).


5
$ .get, gönderildiğinde json'u tanıyabilir. var glacier = data;yeterli olmalı.
roselan

46
Özetle: iki kez ayrıştırmaya çalışıyorsunuz.
fiatjaf


Ben de benzer var Uncaught SyntaxError: Unexpected token Içünkü Python kodlamaktajson.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
Bob Stein

Yanıtlar:


314

Görünüşe göre jQuery veri türü hakkında bir tahminde bulunur. GetJSON () çağrmasanız bile JSON ayrıştırma yapar - o zaman bir nesnede JSON.parse () öğesini çağırmaya çalıştığınızda hatayı alıyorsunuz.

Daha fazla açıklama Aditya Mittal'ın cevabında bulunabilir .


13
Aha, bu yüzden veri [0] .english "bag" döndürür. Görünüşe göre hiç json dosyasını ayrıştırmak zorunda değilim.
Bjorninn

1
bu ilginç .. JQuery veri tipinde bir tahmin alır ve json olduğunu varsayar. GetJson'un da işe yarayacağını düşünürdüm, değil mi?
ek_ny

87
Küçük not: Eğer JSON.parsebir nesne varsa "Beklenmeyen simge o" sadece ayrıştırmaya çalıştığı için atılır obj_to_parse.toString(), yani [object Object]. Deneyin JSON.parse('[object Object]');;)
Pier Paolo Ramon

22
Bana da oldu, sanırım benim
hatam JSON'a

2
jQuery tahmin etmez . Bunu geçersiz kılmazsanız dataType(neden böyle yaparsanız), Content-typene tür bir veri olduğunu belirlemek için yanıtın HTTP üstbilgisini kullanır ve jQuery tarafından tanınan bir veri ise, ayrıştırır.
Quentin

76

Sorun çok basit

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

İki kez ayrıştırıyorsunuz. getkullanır dataType='json', bu nedenle veriler zaten json biçimindedir. $.ajax({ dataType: 'json' ...Döndürülen veri türünü özel olarak ayarlamak için kullanın !


54

Temel olarak yanıt başlığı metin / html ise, ayrıştırma yapmanız gerekir ve yanıt başlığı application / json ise sizin için zaten ayrıştırılır.

Metin / html yanıtı için jquery başarılı işleyicisinden ayrıştırılmış veriler:

var parsed = JSON.parse(data);

Uygulama / json yanıtı için jquery başarı işleyicisinden ayrıştırılmış veriler:

var parsed = data;

6
Bunu oy kullanan herkese dikkat edin, yukarıdaki kabul edilen cevap bu cevaptan tam bir kopya içerir. Şimdi kabul edilen yanıttan bağlantı ekleniyor.
Geoffrey Hale

11

Unexpected tokenHatalar için başka ipuçları . Javascript nesneleri ve json arasında iki büyük fark vardır:

  1. json verileri her zaman çift tırnak içine alınmalıdır.
  2. anahtarlar alıntılanmalıdır

Doğru JSON

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

Hata JSON 1

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

Hata JSON 2

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

düşünce

Bu, bu soruya doğrudan bir cevap değildir. Ama bu Unexpected tokenhataların cevabı . Bu nedenle, bu soruya rastlayan başkalarına yardımcı olabilir.


2

Yanıt zaten ayrıştırılmış, tekrar ayrıştırmanıza gerek yok. tekrar ayrıştırırsanız size "beklenmedik jeton o" verir, ancak isteğinizde veri türünü belirtmeniz gerekirdataType='json'


1

Şimdilik benzer bir sorun yaşadım ve çözümüm yardımcı olabilir. Yüklemek ve bir xml dosyasını json'a dönüştürmek ve sahne arkasına geri göndermek için bir iframe kullanıyorum ve Chrome gelen verilere yalnızca aralıklı olarak görünecek ve "Yakalanmayan SyntaxError: Beklenmedik simge o" hata.

Bu gibi iframe verilerine erişiyordum:

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

localhost üzerinde iyi çalıştı, ancak sunucuya yüklediğimde sadece bazı dosyalarla ve yalnızca belirli bir sırada dosyaları yüklerken çalışmayı durdurdu. Buna neyin sebep olduğunu gerçekten bilmiyorum, ama bu düzeltti. Yukarıdaki satırı değiştirdim

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

bir kez HTML yanıt bazı çöp fark ettim.

Uzun lafın kısası ham HTML yanıt verilerinizi kontrol edin ve bir şeyleri açabilirsiniz.


Tamam teşekkürler. Garip bir şekilde bazen zaten ayrıştırılmış bir json nesnesi alıyor ve bazen almıyor gibi görünüyor. Projeye devam etmek için zamanım olmadı, bu yüzden bunu rastgele yapıp yapmayacağını bilmiyorum (tarayıcılara ve sistemlere veya başka bir şeye bağlı olarak). İşaretçi için teşekkürler aklımda tutacağım.
Bjorninn

1
SyntaxError: Unexpected token o in JSON

Bu await, JSON verilerini döndüren bir yöntem için anahtar kelimeyi kullanmayı unuttuğunuzda da olur .

Örneğin:

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

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

eksik olduğu için hata verir await. Aslında döndürülen şey bir Promise[nesne] 'dir, a değil string.

Düzeltmek için beklediğiniz gibi ekleyin:

var json_str = await returnJSONData();

Bu oldukça açık olmalıdır, ancak hata çağrılır JSON.parse, bu nedenle yöntem çağrınız ile çağrı arasında biraz mesafe varsa kaçırmak kolaydır .awaitJSON.parse


0

JSON dosyanızın önce veya sonra arka karakteri olmadığından emin olun. Belki yazdırılamaz olanı? Bu şekilde denemek isteyebilirsiniz:

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

1
JSON.parse ([{ "ingilizce": "torba", "kana": "kaban", "Kanji": "K"}, { "ingilizce": "camlar", "Kana": "megane"," kanji ":" M "}] '); İyi çalışıyor. The Dosyanın doğru yüklenip yüklenmediğini kontrol etmek için bu satırı uyarı (veriler) ile değiştirmeyi denediniz mi?
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'nin "SyntaxError: 1 pozisyonunda JSON'da beklenmeyen simge o - Yığın Taşması" hatasını veren verilerle mücadele etmesi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.