parsing - parser JSON JavaScript yang menunjukkan posisi kesalahan


Saya mengalami beberapa masalah dengan parsing JSON yang diterima melalui WebSocket (pertanyaan asli - Parse JSON received with WebSocket results in error). String JSON itu sendiri valid (sudah diuji dengan beberapa validator JSON), tetapi JSON.parse melemparkan pengecualian. Saya mencoba mencari tahu apa sebenarnya yang tidak bisa diparse, tetapi satu-satunya yang saya dapatkan adalah "SyntaxError: unexpected_token ILLEGAL", tidak ada informasi tentang posisi pasti token yang gagal. Apakah ada cara untuk mendapatkan informasi tersebut?

Pembaruan: Jika saya menyalin-tempel string JSON itu ke file statis (misalnya "data.json") dan kemudian mengambilnya serta mem-parsing-nya dengan fungsi yang sama (JSON.parse) - maka itu bekerja dengan baik. Jadi saya mengasumsikan ada sesuatu yang rumit sedang terjadi, saya berpikir tentang simbol garis baru (mungkin ada \n alih-alih \r\n atau sebaliknya) tetapi menghapus seluruh pemisah baris tidak membantu. Saya pikir ini mungkin masalah pengkodean, tetapi data diterima melalui websocket dan menurut dokumentasi itu adalah string utf-8.

Pembaruan ke-2: IT WORKS berjalan dengan baik jika saya menggunakan "json_parse" dari sini: https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js Kemudian itu berjalan dengan baik! Apakah itu berarti ini adalah bug dalam implementasi "JSON.parse" yang digunakan oleh Chrome atau bagaimana?

Terima kasih.

Jawaban #1

Anda bisa menyalin implementasi JSON.parse() dari suatu tempat (misalnya dari jQuery), mengubah namanya sehingga Anda bisa memanggilnya secara langsung, mengubah implementasinya sehingga tidak pernah mendeteksi parser bawaan sehingga selalu menggunakan parser JS dan kemudian mengubah kode Anda untuk menggunakan versi JS baru dari parser tersebut, lalu menelusuri melalui debugger javascript sampai Anda menemukan apa yang tidak disukainya.

Jawaban #2

Satu hal yang perlu diperiksa adalah apakah Anda memiliki tanda kutip dan garis miring dalam string JSON Anda. Jika ya, mereka perlu di-escape:

{
    "key": "i've \"quotes\" in me",
    "key2": "and \\slashes too"
}

Selain itu, JSONLint memberi Anda lokasi tepat dari kesalahan tersebut.

Menurut JSON.org, Anda tidak bisa menggunakan tanda kutip dan garis miring di dalam string Anda, jadi Anda perlu meloloskannya.