SyntaxError: Token tak terduga di JSON di posisi 1

139

Saya mengurai beberapa data menggunakan kelas tipe di controller saya, saya mendapatkan data sebagai berikut:

{  
   "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"
}

Saya mencoba menyimpan data seperti ini

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

Bagaimana saya bisa mengekstrak daftar pengguna ke variabel baru?

Soniya Mohan
sumber
11
Anda mungkin tidak perlu menggunakan JSON.parse. Coba gunakan userDatasecara langsung sebagai objek.
Mohit Bhardwaj
13
Jika console.log(typeof userData)ditampilkan objectmaka Anda sudah memiliki objek javascript dan bukan string JSON yang harus Anda uraikan.
t.niese
1
@MohitBhardwaj ya, tidak perlu diminta untuk parse ..
Soniya Mohan
5
Biasanya setiap kali Anda mendapatkan kesalahan ini - Unexpected token o in JSON, kemungkinan besar Anda mencoba mengurai objek yang sudah dalam bentuk diuraikan.
Mohit Bhardwaj
@MohitBhardwaj oke!
Soniya Mohan

Jawaban:

191

JSON yang Anda poskan terlihat baik-baik saja, namun dalam kode Anda, kemungkinan besar bukan string JSON lagi, tetapi sudah menjadi objek JavaScript. Ini berarti, tidak perlu lagi menguraikan.

Anda dapat mengujinya sendiri, misalnya di konsol Chrome:

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()mengubah input menjadi string. The toString()metode objek JavaScript dengan hasil standar [object Object], sehingga perilaku yang diamati.

Coba yang berikut ini sebagai gantinya:

var newData = userData.data.userList;
Timo
sumber
1
Jadi ini berlaku untuk semua jenis browser?
comeOnGetIt
@Timo Bisakah Anda melihat tautan ini.
V SH
Kadang-kadang kesalahan ini dapat muncul ketika titik akhir api url yang melayani permintaan memiliki kesalahan dalam kode atau beberapa file lain yang disertakan atau digunakan dan itu melemparkan kesalahan yang tidak ditangani atau dicatat. Sebagian besar Anda bisa mendapatkan ini jika Anda melihat tab jaringan di alat pengembang Browser atau Anda dapat mencapai titik akhir menggunakan post man dan melihat apa yang muncul.
MuturiAlex
65

parameter pertama dari fungsi JSON.parseharus menjadi String, dan data Anda adalah objek JavaScript, jadi itu akan dikonversi ke String [object object], Anda harus menggunakan JSON.stringifysebelum meneruskan data

JSON.parse(JSON.stringify(userData))
Huruji
sumber
1
Sangat membantu kawan. Terima kasih :)
Anand_5050
Itu membantu. Terima kasih atas solusinya.
Nag Arjun
Anda menyelamatkan teman saya hari ini. Terima kasih :)
Dwarkesh Soni
ini tidak akan berfungsi ketika string berisi kutipan ganda apakah Anda punya solusi
Mr S Coder
23

Jangan pernah gunakan JSON.parsetanpa membungkusnya di try-catchblok:

// payload 
let userData = null;

try {
    userDate = 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
Kousha
sumber
7
Ini sebenarnya tidak menjawab pertanyaan, tetapi komentar tentang kurangnya penanganan pengecualian.
Richard Duerr
2
@ RichardDuerr, tetapi ini akan membantu untuk memperbaiki kesalahan topik kepala. yaitu SyntaxError: Token tak terduga di JSON di posisi 1
Niko Jojo
6
Itu hanya menyembunyikan kesalahan, tetapi tidak benar-benar menyelesaikannya.
Richard Duerr
21

Tepat di atas JSON.parse, gunakan:

var newData = JSON.stringify(userData)
Sukhchain
sumber
4
JSON.stringify()mengkonversi objek JavaScript ke representasi string, yang merupakan kebalikan dari apa yang JSON.parse()dilakukannya. Anda mendapatkan SyntaxErrorkarena Anda mencoba mengurai sesuatu yang sudah menjadi objek. Dalam solusi @ Sukhchain, itu akan dikonversi ke string untuk menghindari itu.
Hubert
1
Kelemahannya adalah, pada akhirnya Anda menggunakan JSON.parse()terlalu banyak secara berlebihan. Meskipun ini proses yang cukup cepat, penguraian JSON dilakukan secara serempak dan berpotensi memblokir UI Anda, jadi saya menyarankan Anda untuk tidak menggunakannya. Sebagai gantinya, Anda bisa memeriksa apakah variabel Anda adalah objek, misalnya menggunakan typeof(userData) === 'object'sebelum mencoba menguraikannya.
Hubert
2

Nah, saya berarti bahwa saya perlu untuk mengurai objek seperti ini: var jsonObj = {"first name" : "fname"}. Tapi, sebenarnya tidak. Karena sudah menjadi JSON.

М.Б.
sumber
2

Kami juga dapat menambahkan cek seperti ini:

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

    return {};
}
Pulkit chadha
sumber
1

Kesalahan 'O' yang tidak terduga dilemparkan ketika data JSON atau String terjadi untuk diuraikan.

Jika itu adalah string, itu sudah diikat. Parsing berakhir dengan kesalahan 'O' yang tidak terduga.

Saya menghadapi hal yang sama (walaupun dalam konteks yang berbeda), saya memecahkan kesalahan berikut dengan menghapus JSON Produser.

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

  }

Respons berisi string kembali "OK" . Anotasi yang ditandai sebagai @Produces ({** MediaType.APPLICATION_JSON }) ** mencoba mengurai string ke format JSON yang menghasilkan 'O' yang tidak terduga .

Menghapus @Produces ({ MediaType.APPLICATION_JSON }) berfungsi dengan baik. Output: Oke

Hati-hati: Juga, di sisi klien, jika Anda membuat permintaan ajax dan menggunakan JSON.parse ("OK"), ia melempar token 'O' yang tidak terduga

O adalah huruf pertama dari string

JSON.parse (objek) membandingkan dengan jQuery.parseJSON (objek);

JSON.parse ('{"name": "Yergalem", "city": "Dover"}'); --- Bekerja dengan baik

Yergalem
sumber