Saya harus membentuk string JSON di mana nilai memiliki karakter baris baru. Ini harus lolos dan kemudian diposting menggunakan panggilan AJAX. Adakah yang bisa menyarankan cara untuk melarikan diri dari string dengan JavaScript. Saya tidak menggunakan jQuery.
javascript
escaping
Srikant
sumber
sumber
Jawaban:
Ambil JSON Anda dan
.stringify()
itu. Kemudian gunakan.replace()
metode ini dan ganti semua kejadian\n
dengan\\n
.EDIT:
Sejauh yang saya tahu, tidak ada perpustakaan JS terkenal untuk melarikan diri semua karakter khusus dalam sebuah string. Tetapi, Anda dapat membuat rantai
.replace()
metode dan mengganti semua karakter khusus seperti ini:Tapi itu cukup jahat, bukan? Masukkan keindahan fungsi, karena memungkinkan Anda untuk memecah kode menjadi beberapa bagian dan menjaga alur utama skrip Anda bersih, dan bebas dari 8
.replace()
panggilan berantai . Jadi mari kita letakkan fungsionalitas itu ke dalam fungsi yang disebutescapeSpecialChars()
,. Mari kita pergi ke depan dan melampirkannya keprototype chain
satuString
objek, sehingga kami dapat menghubungiescapeSpecialChars()
langsung di String objek.Seperti itu:
Setelah kami mendefinisikan fungsi itu, isi utama kode kami sesederhana ini:
sumber
Sesuai dengan user667073 yang disarankan, kecuali menyusun ulang penggantian backslash terlebih dahulu, dan memperbaiki penggantian kutipan
sumber
Line separator
\u2028
danParagraph separator
\u2029
. Ref: es5.github.io/#x7.3Uncaught SyntaxError: Unexpected token \ in JSON at position 2
Seperti Anda, saya telah melihat beberapa komentar dan posting untuk mengganti karakter pelarian khusus di JSON saya yang berisi objek html di dalamnya.
Objek saya adalah menghapus karakter khusus dalam objek JSON dan juga me-render html yang ada di dalam objek json.
Inilah yang saya lakukan dan berharap sangat mudah digunakan.
Pertama saya melakukan JSON.stringify objek json saya dan JSON.parse hasilnya.
Untuk misalnya:
Dan itu memecahkan masalah saya dan selesai menggunakan Javascript Murni.
sumber
stackoverflow
kesalahanJSON.parse(JSON.stringify($("body")))
dalam file html dengan tubuh dan beberapa tabel. $ ("body") adalah objek javascript tetapi string akan gagal menguraikannya.Saya takut mengatakan bahwa jawaban yang diberikan oleh Alex agak salah, dengan kata lain:
Fungsi ini
tampaknya merupakan perkiraan yang lebih baik.
sumber
Pembaruan kecil untuk kutipan tunggal
sumber
ini adalah pos lama. tetapi mungkin masih bermanfaat bagi mereka yang menggunakan angular.fromJson, dan JSON.stringify. escape () sudah usang. gunakan ini sebagai gantinya,
ref http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp
sumber
Ada juga parameter kedua di JSON.stringify. Jadi, solusi yang lebih elegan adalah:
sumber
Ini adalah pertanyaan lama tetapi solusinya tidak bekerja dengan baik bagi saya karena tidak menyelesaikan semua kasus. Saya akhirnya menemukan jawaban yang berhasil di sini
Saya akan memposting solusi gabungan saya baik menggunakan escape dan menyandikan komponen uri:
sumber
escape = (string) -> JSON.stringify(string)[1...-1]
Lebih baik digunakan
JSON.parse(yourUnescapedJson);
sumber
Gunakan json_encode () jika bahasa skrip sisi server Anda adalah PHP,
json_encode()
lewati baris baru & token tak terduga lainnya untuk Anda (jika tidak menggunakan tampilan PHP untuk fungsi serupa untuk bahasa skrip Anda)lalu gunakan
$.parseJSON()
di JavaScript Anda, selesai!sumber
<script> windows.data_from_php = <?php echo json_encode(json_encode($arrayOrObjToJs)); ?>; var phpData = JSON.parse(windows.data_from_php); </script>
php JSON.parse pengkodean gandaSaya mendapat situasi yang sama di salah satu panggilan Ajax saya, di mana
JSON
ada kesalahan karena baris baru di bidang Textarea. Solusi yang diberikan di sini tidak berhasil untuk saya. Jadi saya menggunakan.escape
fungsi Javascript dan bekerja dengan baik. Kemudian untuk mengambil nilai dariJSON
, saya hanya menggunakan unescaped.unescape
.sumber
Saya menggunakan built in jQuery.serialize () untuk mengekstrak nilai dari textarea untuk urlencode input. Bagian pro adalah bahwa Anda tidak perlu mencari mengganti setiap karakter khusus Anda sendiri dan saya juga menjaga baris baru dan lolos dari html. Untuk membuat serialisasi agar berfungsi, tampaknya bidang input perlu memiliki atribut nama dan juga menambahkan atribut yang sama ke string yang lolos yang perlu diganti. Mungkin bukan yang Anda cari, tetapi itu bekerja untuk saya.
sumber
Ketika menggunakan segala bentuk Ajax, dokumentasi terperinci untuk format tanggapan yang diterima dari server CGI tampaknya kurang di Web. Beberapa entri di sini menunjukkan bahwa baris baru dalam teks yang dikembalikan atau data json harus melarikan diri untuk mencegah loop tak terbatas (hang) dalam konversi JSON (mungkin dibuat dengan melemparkan pengecualian yang tidak tertangkap), baik dilakukan secara otomatis oleh jQuery atau secara manual menggunakan sistem Javascript atau pustaka JSON pustaka panggilan.
Dalam setiap kasus di mana programmer memposting masalah ini, solusi yang tidak memadai disajikan (paling sering mengganti \ n oleh \ n di sisi pengiriman) dan masalah tersebut dibatalkan. Ketidakmampuan mereka terungkap ketika melewati nilai string yang secara tidak sengaja menanamkan urutan pelarian kendali, seperti nama path Windows. Contohnya adalah "C: \ Chris \ Roberts.php", yang berisi karakter kontrol ^ c dan ^ r, yang dapat menyebabkan konversi JSON dari string {"file": "C: \ Chris \ Roberts.php"} ke lingkaran selamanya. Salah satu cara untuk menghasilkan nilai-nilai tersebut adalah dengan sengaja mencoba untuk menyampaikan peringatan PHP dan pesan kesalahan dari server ke klien, ide yang masuk akal.
Menurut definisi, Ajax menggunakan koneksi HTTP di belakang layar. Koneksi tersebut meneruskan data menggunakan GET dan POST, yang keduanya membutuhkan pengodean data yang dikirim untuk menghindari sintaks yang salah, termasuk karakter kontrol.
Ini memberi cukup petunjuk untuk membangun apa yang tampaknya menjadi solusi (perlu pengujian lebih lanjut): untuk menggunakan rawurlencode pada sisi PHP (pengiriman) untuk menyandikan data, dan menghapus tanda pada sisi Javascript (penerima) untuk mendekode data. Dalam beberapa kasus, Anda akan menerapkan ini ke seluruh string teks, dalam kasus lain Anda hanya akan menerapkannya pada nilai-nilai di dalam JSON.
Jika ide ini ternyata benar, contoh-contoh sederhana dapat dibangun untuk membantu programmer di semua tingkatan menyelesaikan masalah ini untuk selamanya.
sumber
Sepertinya ini adalah posting kuno benar-benar :-) Tapi teman-teman, solusi terbaik yang saya miliki untuk ini, menjadi 100% bekerja tanpa kode rumit, adalah dengan menggunakan kedua fungsi pengkodean / decoding ke base64. Ini adalah atob () dan btoa (). Sejauh ini cara termudah dan terbaik, tidak perlu khawatir jika Anda melewatkan karakter apa pun untuk melarikan diri.
George
sumber
Jika Googles Anda terus mendaratkan Anda di sini dan api Anda melontarkan kesalahan kecuali tanda kutip ganda JSON Anda lolos (
"{\"foo\": true}"
), yang perlu Anda lakukan adalah meringkas dua kali misalnyaJSON.stringify(JSON.stringify(bar))
sumber
Gunakan encodeURIComponent () untuk menyandikan string.
Misalnya. var myEscapedJSONString = encodeURIComponent (JSON.stringify (myJSON));
Anda tidak perlu men-decode karena server web secara otomatis melakukan hal yang sama.
sumber
Jangan pernah menggunakan ekspresi reguler (maksud saya tidak pernah sama sekali). Cara terbaik dan efektif:
sumber