Yakalanmayan Sözdizimi Hatası: JSON.parse ile beklenmeyen simge


192

üçüncü satırda bu hataya ne sebep olur?

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o

Hatayı görüntülemek için konsolu aç


16
JSON'unuz yok mu? Bu bir dizi / nesne değişmezidir.
Bergi

Yanıtlar:


220

productsbir nesnedir. (bir nesne hazır bilgisinden oluşturma)

JSON.parse()JSON gösterimini içeren bir dizeyi bir Javascript nesnesine dönüştürmek için kullanılır .

Kodunuz .toString(), JSON metni olarak ayrıştırmayı denemek için nesneyi bir dizeye (arayarak ) dönüştürür .
Varsayılan JSON olmayan varsayılan .toString()döndürür "[object Object]"; dolayısıyla hata.


1
Dizi değil mi? Neden bir nesne. Nesneler {ile başlar ve diziler [? ya da burada yanlış

4
Diziler nesnelerdir; o en neyi .toString()döner (spec göre).
SLaks

1
İlk olarak nesneyi dizgi haline getirmek için çözüm var mı?
Mohammed Noureldin

6
@MohammedNoureldin: Hayır; çözüm hiçbir şey yapmamak ve nesnenizi kullanmaktır.
SLaks

2
Verilerimi bana Json yanıtı veren Ajax kullanarak uzak bir hizmetten alırsam ne olur? Ve bu yanıtın JavaScript dizi nesnesine kaydedilmesini istiyorum?
Mohammed Noureldin

125

Bunun geçerli bir JSON olduğunu bildiğinizi varsayalım, ancak yine de bunu alıyorsunuz ...

Bu durumda, dizede bunları elde ettiğiniz herhangi bir kaynaktan gizli / özel karakterler olması muhtemeldir. Doğrulayıcıya yapıştırdığınızda kaybolurlar - ancak dizede hala oradadırlar. Bu karakterler görünmez olsa da kırılacakJSON.parse()

Eğer sham JSON, sonra onu ile temizlemek:

// preserve newlines, etc - use valid JSON
s = s.replace(/\\n/g, "\\n")  
               .replace(/\\'/g, "\\'")
               .replace(/\\"/g, '\\"')
               .replace(/\\&/g, "\\&")
               .replace(/\\r/g, "\\r")
               .replace(/\\t/g, "\\t")
               .replace(/\\b/g, "\\b")
               .replace(/\\f/g, "\\f");
// remove non-printable and other non-valid JSON chars
s = s.replace(/[\u0000-\u0019]+/g,""); 
var o = JSON.parse(s);

Hatayı alıyordum ve bir dizede garip bir karaktere kadar izledim. Geçerli olmayan JSON karakterlerini kaldırma yönteminizi kullandım ve işe yaradı.
albertski

1
buraya iki kere geldi. thnx
Benjamin Hoffman

Base64 kod çözme işleminden sonra özel bir karakter kazandınız, yönteminiz bana çok yardımcı oldu! Teşekkürler
Guillaume

geçersiz JSON ile yanıt veren bir kaynağa güvenmeyin. Verilerin bozuk olduğunu bildirmeniz yeterlidir. düzeltmeleri gerekir. yanıtı bu şekilde veya benzer yollarla "kurtarmaya" çalışırsanız, dengesiz bir iletişimi sürdürürsünüz.
Onur Yıldırım

Olmalı s = s.replace(/[\u0000-\u001F]+/g,""); yerine s = s.replace(/[\u0000-\u0019]+/g,""); bütün kontrol karakterleri değiştirilmesi için. Sağ?
HongchaoZhang

64

Nesneyi dizgi yapmak istediğiniz anlaşılıyor . Öyleyse bunu yapın:

JSON.stringify(products);

Hatanın nedeni JSON.parse()bir Stringdeğer beklemek ve productsbirArray .

Not: Ben girişimlerini düşünüyorum json.parse('[object Array]')o belirteci beklemiyorduk şikayet oSONRA [.


28

İle aynı sorunu buldum JSON.parse(inputString) .

Benim durumumda girdi dizesi sunucu sayfamdan geliyor [sayfa yönteminin dönüşü] .

Yazdırdım typeof(inputString) - bu dize, yine de hata oluşur.

Ben de denedim JSON.stringify(inputString) , ama yardımcı olmadı.

Daha sonra bunun [\n]bir alan değeri içinde yeni hat operatörü ile ilgili bir sorun olduğunu gördüm .

Ben did yerine [diğer bazı karakteriyle, ayrıştırma sonrası yeni hat geri koymak] ve her şey iyi çalışıyor.


2
Yeni çizgi karakteri de benim sorunumdu. Peki bu tür verileri nasıl geri yükleyebiliriz?
kolenda

@kolenda Geçersiz JSON var. Geçerli JSON döndüren gerçek bir JSON serileştirici kullanmak için sunucunuzu değiştirmeniz gerekir.
SLaks

Ben benzer bir sorun vardı ama "\ n" yerine bir yol içinde bir "\ e" vardı ("\" yerine "/" kullanmak için sunucu tarafı kodunu değiştirdim ve her şey tekrar çalışıyordu)
Adam Tal

\ n n olacak bir kaçış kullan \\ n
Paul Gregoire

14

JSON.parse parametresinde bir Dize bekliyor. Sorunu çözmek için JSON nesnenizi dizginlemeniz gerekir.

products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];
console.log(products);
var b = JSON.parse(JSON.stringify(products));  //solves the problem

12
products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];

değişmek

products = '[{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}]';

2
@SLaks evet, OP ürünleri doğrudan kullanabilir. ama eğer kullanmak istiyorsa JSON.parse, argümanların bir dize olması gerekir.
pktangyue

ASP Classic'te ne yapmalıyım çünkü 'yorum
ashish bhatt

1
@ashishbhatt "kullanabilirsiniz, sonra diğer tüm" olarak \ "değiştirin
pktangyue

2
Böyle bir şeyJSON.parse(products.replace(/'/g, '"'))
Kimyasal Programcı

11

JSON dizenizi burada doğrulamanız gerekir .

Geçerli bir JSON dizesi, anahtarların çevresinde çift tırnak işareti içermelidir:

JSON.parse({"u1":1000,"u2":1100})       // will be ok

Tırnak işareti yoksa hataya neden olur:

JSON.parse({u1:1000,u2:1100})    
// error Uncaught SyntaxError: Unexpected token u in JSON at position 2

Tek tırnak işareti kullanmak da hataya neden olur:

JSON.parse({'u1':1000,'u2':1100})    
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1

Benim durumumda, Grails 2.5.6 render ([key: value])tek tırnak ile işlendi ve jQuery Ajax 1 konumunda JSON parseError yol açtı. render (groovy.json.JsonOutput.toJson ([key:value]))bana yardım etti.
philburns


3
[
  {
    "name": "Pizza",
    "price": "10",
    "quantity": "7"
  },
  {
    "name": "Cerveja",
    "price": "12",
    "quantity": "5"
  },
  {
    "name": "Hamburguer",
    "price": "10",
    "quantity": "2"
  },
  {
    "name": "Fraldas",
    "price": "6",
    "quantity": "2"
  }
]

İşte ayrıştırabileceğiniz mükemmel Json'unuz.


3

İşte önceki yanıtlara dayanarak yaptığım bir fonksiyon: benim makinemde çalışıyor ama YMMV.

          /**
             * @description Converts a string response to an array of objects.
             * @param {string} string - The string you want to convert.
             * @returns {array} - an array of objects.
            */
            function stringToJson(input) {
              var result = [];

              //replace leading and trailing [], if present
              input = input.replace(/^\[/,'');
              input = input.replace(/\]$/,'');

              //change the delimiter to 
              input = input.replace(/},{/g,'};;;{');

              // preserve newlines, etc - use valid JSON
              ///programming/14432165/uncaught-syntaxerror-unexpected-token-with-json-parse
            input = input.replace(/\\n/g, "\\n")  
            .replace(/\\'/g, "\\'")
            .replace(/\\"/g, '\\"')
            .replace(/\\&/g, "\\&")
            .replace(/\\r/g, "\\r")
            .replace(/\\t/g, "\\t")
            .replace(/\\b/g, "\\b")
            .replace(/\\f/g, "\\f");
            // remove non-printable and other non-valid JSON chars
            input = input.replace(/[\u0000-\u0019]+/g,""); 

              input = input.split(';;;');

              input.forEach(function(element) {
                // console.log(JSON.stringify(element));

                result.push(JSON.parse(element));
              }, this);

              return result;
            }

2

"SyntaxError: Unexpected token"Arama sırasında istisnaya neden olabilecek bir diğer gotcha JSON.parse(), dize değerlerinde aşağıdakilerden herhangi birini kullanıyor:

  1. Yeni satır karakterleri.

  2. Sekmeler (evet, Sekme tuşuyla oluşturabileceğiniz sekmeler!)

  3. Tek başına eğik çizgi \(ancak bir nedenden ötürü /, en azından Chrome'da değil.)

(Tam liste için buradaki Dize bölümüne bakın .)

Örneğin, aşağıdakiler size bu istisnayı getirir:

{
    "msg" : {
        "message": "It cannot
contain a new-line",
        "description": "Some discription with a     tabbed space is also bad",
        "value": "It cannot have 3\4 un-escaped"
    }
}

Bu yüzden şu şekilde değiştirilmelidir:

{
    "msg" : {
        "message": "It cannot\ncontain a new-line",
        "description": "Some discription with a\t\ttabbed space",
        "value": "It cannot have 3\\4 un-escaped"
    }
}

Söylemeliyim ki, daha fazla metin içeren sadece JSON biçiminde okunamaz hale getiriyor.



1

Umarım bu başka birine yardımcı olur.

Benim sorunum, yorumları ayrıştırmak ve geçersiz JSON döndürmek AJAX üzerinden bir PHP geri arama işlevi HTML yorum vardı oldu.

Yorumlanan HTML'yi kaldırdığımda, her şey iyiydi ve JSON sorunsuz bir şekilde ayrıştırıldı.


0

ürünleri doğrudan kullanılabilecek bir dizidir:

var i, j;

for(i=0;i<products.length;i++)
  for(j in products[i])
    console.log("property name: " + j,"value: "+products[i][j]);

0

Şimdi görünüşe göre \r, \b, \t,\f , vb, söz konusu hatayı sadece sorunlu karakter değildir.

Bazı tarayıcıların giriş için ek gereksinimler olabileceğini unutmayın .JSON.parse .

Bu test kodunu tarayıcınızda çalıştırın:

var arr = [];
for(var x=0; x < 0xffff; ++x){
    try{
        JSON.parse(String.fromCharCode(0x22, x, 0x22));
    }catch(e){
        arr.push(x);
    }
}
console.log(arr);

Chrome'da Test, ben izin vermez görüyoruz JSON.parse(String.fromCharCode(0x22, x, 0x22));neredex , 34, 92 veya 0'dan 31'e .

Karakter 34 ve 92 sırasıyla "ve \karakteridir ve genellikle beklenir ve düzgün bir şekilde kaçarlar. Size sorun verecek olan 0 ila 31 karakterleri.

Hata ayıklamaya yardımcı olmak için, sizden önce JSON.parse(input), girişin sorunlu karakterler içermediğini doğrulayın:

function VerifyInput(input){
    for(var x=0; x<input.length; ++x){
        let c = input.charCodeAt(x);
        if(c >= 0 && c <= 31){
            throw 'problematic character found at position ' + x;
        }
    }
}

0

Neden JSON.parse'a ihtiyacınız var? Zaten nesne biçimindedir.

JSON.stringify'ı aşağıdaki gibi daha iyi kullanın: var b = JSON.stringify(products);

Bu size yardımcı olabilir.


0

Ah adamım, şu ana kadar verilen cevapların hepsinde çözümler benim için işe yaramadı. Şimdi benzer bir sorun yaşadım. Alıntı ile sarmayı çözmeyi başardım. Ekran görüntüsüne bakın. Hoo.

resim açıklamasını buraya girin

Orijinal:

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o


0

Başka bir deyişle "beklenmeyen simge o" alıyorsanız hata json beklenen ancak ayrıştırma sırasında nesne elde olmasıdır. Bu "o", "nesne" kelimesinin ilk harfidir.


0

Yaptığınız tek hata, zaten ayrıştırılmış nesneyi ayrıştırmaktır, bu yüzden hata atıyor, bunu kullanın ve gitmek için iyi olacaksınız.

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products[0].name); //name of item at 0th index

json'un tamamını yazdırmak istiyorsanız JSON.stringify () kullanın


0

Birçok nedenden ötürü olabilir, ancak muhtemelen geçersiz bir karakter için kullanabilirsiniz, böylece JSON.stringify(obj);nesneyi bir JSON'a dönüştürecek, ancak bunun bir JQUERY ifadesi olduğunu unutmayın.


0

Bu hata var çünkü json nesnesini döndüren API bir ERROR (benim durumumda Code Igniter, php kodu başarısız olduğunda bir html döndürüyor) vererek böylece bir JSON NESNE DEĞİLDİR.

SQL Cümlelerini ve PHP kodunu kontrol edin ve Postacı (veya başka bir API test cihazı) ile test edin


0

Yaptığım hata geçiyordu null (bilmeden) JSON.parse () 'a .

Böylece fırlattı Unexpected token n in JSON at position 0


-24

Kullanın eval. JavaScript ifadesini / kodunu dize olarak alır ve değerlendirir / yürütür.

eval(inputString);

Eval () 'nin her çağrılması, JavaScript yorumlayıcısının yeni bir örneğini oluşturur. Bu bir kaynak domuzu olabilir.
Yëco
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.