Sözdizimi Hatası: JSON'da beklenmeyen simge o, konum 1'de


139

Denetleyicimde bir tür sınıfı kullanarak birkaç veriyi ayrıştırıyorum, aşağıdaki gibi verileri alıyorum:

{  
   "data":{  
      "userList":[  
         {  
            "id":1,
            "name":"soni"
         }
      ]
   },
   "status":200,
   "config":{  
      "method":"POST",
      "transformRequest":[  
         null
      ],
      "transformResponse":[  
         null
      ],
      "url":"/home/main/module/userlist",
      "headers":{  
         "rt":"ajax",
         "Tenant":"Id:null",
         "Access-Handler":"Authorization:null",
         "Accept":"application/json, text/plain, */*"
      }
   },
   "statusText":"OK"
}

Verileri böyle saklamaya çalıştım

var userData = _data;
var newData = JSON.parse(userData).data.userList;

Kullanıcı listesini yeni bir değişkene nasıl çıkarabilirim?


11
Kullanmanıza gerek olmayabilir JSON.parse. userDataDoğrudan bir nesne olarak kullanmayı deneyin .
Mohit Bhardwaj

13
Eğer console.log(typeof userData)gösterileri objecto zaman zaten bir JSON dize bir javascript nesnesi değil var sen ayrıştırma gerekir.
t.niese

1
@MohitBhardwaj evet, ayrıştırma için gerekli değil ..
Soniya Mohan

5
Genellikle bu hatayı her aldığınızda - Unexpected token o in JSONbüyük olasılıkla zaten ayrıştırılmış biçimde olan bir nesneyi ayrıştırmaya çalışıyorsunuzdur.
Mohit Bhardwaj

@MohitBhardwaj tamam!
Soniya Mohan

Yanıtlar:


194

Gönderdiğiniz JSON iyi görünüyor, ancak kodunuzda büyük olasılıkla artık bir JSON dizesi değil, zaten bir JavaScript nesnesidir. Bu, artık ayrıştırmaya gerek olmadığı anlamına gelir.

Bunu kendiniz test edebilirsiniz, örneğin Chrome'un konsolunda:

new Object().toString()
// "[object Object]"

JSON.parse(new Object())
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse("[object Object]")
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse()girdiyi bir dizeye dönüştürür. toString()JavaScript yöntemi değerini döndürür nesneleri[object Object] gözlenen davranışı ile sonuçlanır.

Bunun yerine aşağıdakileri deneyin:

var newData = userData.data.userList;

1
Yani bu her tür tarayıcı için geçerli mi?
comeOnGetIt

@Timo Bu bağlantıya bakabilir misin?
Martin

Bazen bu hata, isteğe hizmet eden api url uç noktasının kodunda veya dahil edilen veya kullanılan başka bir dosyada bir hata olduğunda ve işlenmeyen veya not edilmeyen bir hata attığında ortaya çıkabilir. Çoğunlukla, Tarayıcı geliştirici araçlarındaki ağ sekmesine bakarsanız bunu elde edebilirsiniz veya post man kullanarak uç noktaya ulaşabilir ve neyin geldiğini görebilirsiniz.
MuturiAlex

67

işlevin ilk parametreleri JSON.parsebir Dize olmalı ve verileriniz bir JavaScript nesnesidir, bu nedenle bir Dize'ye dönüşecektir , verileri iletmeden önce [object object]kullanmanız gerekirJSON.stringify

JSON.parse(JSON.stringify(userData))

1
Çok yardımcı oldu kardeşim. Teşekkürler :)
Anand_5050

Yardımcı oldu. Çözüm için teşekkürler.
Nag Arjun

Günümü kurtardın kardeşim. Teşekkürler :)
Dwarkesh Soni

dize çift tırnak içerdiğinde bu çalışmayacaktır herhangi bir çözümünüz var mı
Bay S Coder

23

JSON.parseBloğa sarmadan asla kullanmayın try-catch:

// payload 
let userData = null;

try {
    // Parse a JSON
    userData = JSON.parse(payload); 
} catch (e) {
    // You can read e for more info
    // Let's assume the error is that we already have parsed the payload
    // So just return that
    userData = payload;
}

// Now userData is the parsed result

7
Bu aslında soruyu yanıtlamaz, ancak istisna işleme eksikliği üzerine yorumlar.
Richard Duerr

2
@RichardDuerr, ancak bu, ana konu hatasını düzeltmeye yardımcı olacaktır. örn. Sözdizimi Hatası: Beklenmeyen simge o JSON'da konum 1'de
Niko Jojo

6
Bu sadece hatayı gizler, ama aslında onu çözmez.
Richard Duerr

21

Hemen yukarıda JSON.parse, şunu kullanın:

var newData = JSON.stringify(userData)

4
JSON.stringify()bir JavaScript nesnesini onun bir dize gösterimine dönüştürür; bu, ne yaptığının tersidir JSON.parse(). SyntaxErrorZaten bir nesne olan bir şeyi ayrıştırmaya çalıştığın için alıyordun . @ Sukhchain'in çözümünde, bundan kaçınmak için bir dizeye dönüştürülür.
Hubert

1
Bunun dezavantajı, sonunda JSON.parse()çok fazla gereksiz kullanıyorsunuz . Oldukça hızlı bir işlem olmasına rağmen, JSON ayrıştırması eşzamanlı olarak yapılır ve kullanıcı arayüzünüzü potansiyel olarak engelleyebilir, bu yüzden bunu kullanmamanızı tavsiye ederim. Bunun yerine, değişkeninizin bir nesne olup olmadığını kontrol edebilirsiniz, örneğin typeof(userData) === 'object'onu ayrıştırmaya çalışmadan önce kullanarak .
Hubert

2

Sanırım böyle nesneyi ayrıştırmak gerekir anlamına geliyordu: var jsonObj = {"first name" : "fname"}. Ama aslında yapmıyorum. Çünkü zaten bir JSON.


2

Ayrıca aşağıdaki gibi çekler de ekleyebiliriz:

function parseData(data) {
    if (!data) return {};
    if (typeof data === 'object') return data;
    if (typeof data === 'string') return JSON.parse(data);

    return {};
}

1

JSON verileri veya Dize ayrıştırılırken beklenmeyen "O" hatası atılır.

Eğer dizeyse, zaten dizilmiş. Ayrıştırma, Beklenmeyen 'O' hatasıyla sonuçlanır.

Benzer bir durumla karşılaştım (farklı bağlamda olsa da), JSON Producer'ı kaldırarak aşağıdaki hatayı çözdüm.

    @POST
    @Produces({ **MediaType.APPLICATION_JSON**})
    public Response login(@QueryParam("agentID") String agentID , Officer aOffcr ) {
      return Response.status(200).entity("OK").build();

  }

Yanıt "Tamam" dize dönüşünü içerir. @Produces ({** MediaType.APPLICATION_JSON }) ** olarak işaretlenen ek açıklama , dizeyi JSON biçimine ayrıştırmaya çalışır ve bu da Beklenmedik "O" ile sonuçlanır .

@Produces ({ MediaType.APPLICATION_JSON }) kaldırıldığında sorun yok. Çıktı: Tamam

Dikkat: Ayrıca, istemci tarafında ajax isteğinde bulunur ve JSON.parse ("Tamam") kullanırsanız, Beklenmeyen simgesi 'O' atar.

O , dizenin ilk harfidir

JSON.parse (nesne), jQuery.parseJSON (nesne) ile karşılaştırılır;

JSON.parse ('{"name": "Yergalem", "şehir": "Dover"}'); --- İyi çalışıyor

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.