JSON: mengapa garis miring tidak ada?

369

Alasan untuk ini "lolos" saya.

JSON lolos dari garis miring, jadi hash {a: "a/b/c"}diserialisasi sebagai {"a":"a\/b\/c"}gantinya {"a":"a/b/c"}.

Mengapa?

Jason S
sumber
4
FWIW Saya tidak pernah melihat garis miring keluar di JSON, saya baru saja menyadarinya dengan perpustakaan Java di code.google.com/p/json-simple
Jason S
24
PHP json_encode()lolos dari garis miring secara default, tetapi memiliki JSON_UNESCAPED_SLASHESopsi mulai dari PHP 5.4.0 (Maret 2012)
Walter Tross
6
Berikut adalah kode PHP yang tidak akan luput dari setiap tebasan, hanya dalam '</':echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
rustyx
Apakah kode tersebut menyertakan '</': atau apakah kode itu dimulai pada gema? Karena mulai dari gema gagal untuk saya. Saya tidak mendapatkan apa-apa. Ya saya mengganti $ obj untuk variabel saya :)
marciokoko
JSON tidak lolos atau membuat serialisasi apa pun ... serializer JSON Anda tidak. Yang mana yang kamu gunakan?
Lightness Races in Orbit

Jawaban:

284

JSON tidak mengharuskan Anda untuk melakukan itu, itu memungkinkan Anda untuk melakukan itu. Ini juga memungkinkan Anda untuk menggunakan "\ u0061" untuk "A", tetapi itu tidak wajib. Mengizinkan \/membantu saat menyematkan JSON dalam <script>tag, yang tidak memungkinkan </string di dalam, seperti yang ditunjukkan Seb.

Beberapa Microsoft ASP.NET Ajax / JSON API menggunakan celah ini untuk menambahkan informasi tambahan, misalnya, suatu datetime akan dikirim sebagai "\/Date(milliseconds)\/". (Yuck)

Ruben
sumber
4
Itu akan menjadi hal yang baik, lolos hanya </. Padahal JSON tidak sering tertanam dalam tag skrip.
Ruben
8
Lihat posting blog ini untuk alasan format tanggal ASP.NET JSON: weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Michiel van Oosterhout
25
JSON perlu diganti karena implementasi tertentu dari serializer JSON menghasilkan beberapa JSON yang ( sementara sepenuhnya JSON valid ) memiliki beberapa karakter tambahan sehingga juga dapat dimasukkan ke dalam elemen skrip HTML sebagai literal JS ?! Itu tidak begitu banyak membuang bayi keluar dengan air mandi seperti membuang bayi keluar karena seseorang membelikannya satu set sayap air.
Quentin
15
Apa yang saya tidak dapatkan, adalah mengapa serializer JSON akan peduli di mana JSON berakhir. Di halaman web, dalam permintaan HTTP, apa pun. Biarkan penyaji akhir melakukan pengkodean tambahan, jika diperlukan.
Dan Ross
5
@ DanRoss Dan itu bisa. Escaping /tidak diperlukan , diizinkan , untuk memudahkan penggunaan JSON. Jika Anda tidak ingin melarikan diri /, maka jangan.
Andreas
35

Spesifikasi JSON mengatakan Anda BISA melarikan diri dari garis miring, tetapi Anda tidak harus melakukannya.

Harold L
sumber
9
Bisakah Anda menambahkan tautan ke bagian spesifik itu?
Ryan Gates
1
Spec tidak mengatakan itu. Sebenarnya semua yang dikatakan adalah bahwa Anda harus melarikan diri dari karakter solidus. Lihat ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Joa Ebert
10
@ JoEbert: Solidus terbalik harus diloloskan, tetapi Anda tidak perlu melarikan diri dari solidus. Bagian 9 mengatakan "Semua karakter dapat ditempatkan di dalam tanda kutip kecuali untuk karakter yang harus melarikan diri: tanda kutip (U + 0022), membalikkan solidus (U + 005C), dan karakter kontrol U + 0000 ke U + 001F. "
Harold L
4
Harold terima kasih! Anda benar, juga ditunjukkan pada Gambar 5, sebagai "titik kode apa pun kecuali ..." dengan jelas menyatakan bahwa / itu opsional.
Joa Ebert
15

Saya menanyakan pertanyaan yang sama beberapa waktu lalu dan harus menjawabnya sendiri. Inilah yang saya pikirkan:

Sepertinya, pikiran pertama saya [ bahwa itu berasal dari akar JavaScript-nya ] benar.

'\/' === '/'dalam JavaScript, dan JSON adalah JavaScript yang valid. Namun, mengapa pelarian lain yang diabaikan (seperti \z) tidak diizinkan di JSON?

Kunci untuk ini adalah membaca http://www.cs.tut.fi/~jkorpela/www/revsol.html , diikuti oleh http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 . Fitur slash escape memungkinkan JSON untuk disematkan dalam HTML (sebagai SGML) dan XML.

Boldewyn
sumber
5
Mekanisme pengiriman muatan data terstruktur tidak boleh dikaitkan dengan konstruksi bahasa..karena ini mungkin berubah di masa depan ... tetapi ini mungkin menjelaskan keputusan desain jika ada pencipta JSON.
'\ /' === '/' Jadi saya tidak perlu menghapus tanda garis miring saat menerima jsonp saya?
Timmetje
8

PHP lolos dari garis miring ke depan secara default yang mungkin mengapa hal ini sering muncul. Saya tidak yakin mengapa, tetapi mungkin karena menyematkan string ke "</script>"dalam <script>tag dianggap tidak aman.

Fungsionalitas ini dapat dinonaktifkan dengan melewati JSON_UNESCAPED_SLASHESflag, tetapi sebagian besar pengembang tidak akan menggunakan ini karena hasil asli sudah JSON yang valid.

Simon Timur
sumber
5

PHP yang jelek!

The JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESharus default, bukan (aneh) pilihan ... Bagaimana mengatakan kepada php-pengembang?

The bawaan HARUS penggunaan yang paling sering, dan (saat ini) yang paling banyak digunakan standar sebagai UTF8. Berapa banyak fragmen kode PHP di Github atau tempat lain yang memerlukan fitur "embedded in HTML" eksoctic ini?

Peter Krauss
sumber
2
Benar kata! Namun PHP mempromosikan semua kesalahan aneh itu di masa depan, untuk tidak memecahkan bug sebelumnya yang umum di semua cuplikan PHP bersejarah yang rusak yang tersebar di seluruh dunia seperti hama. Oleh karena itu semua keputusan yang salah diambil oleh PHP, yang berarti hampir semua keputusan tentang PHP, menjadi standar. Anda tidak dapat mengharapkan standar untuk berubah, oleh karena itu setiap pengembang PHP harus tahu dan menerapkan semua solusi yang tidak terbatas terhadap semua bug serius yang ditemukan di PHP. Masukkan stackoverflow ..
Tino
Anda sepenuhnya salah. Itu karena JavaScript. Seperti yang ditunjukkan di bawah ini. Dalam JS '\/' === '/'mengembalikan true. Saya akan menyarankan Anda untuk tetap berpegang pada fakta. Kebanyakan orang mampu mengatasi beberapa nama fungsi yang tidak konsisten. Hanya karena Anda tidak dapat melihat masa lalu yang tidak menjadikan PHP alat yang buruk.
Cobolt
1
Hi @Cobolt, Ini adalah pertanyaan lama, saya tidak menggunakan PHP hari ini ... Tapi, sebagai blog diskusi, intinya adalah "Default HARUS paling sering digunakan" , jadi keburukan adalah mengabaikan ini "paling sering digunakan" dari (juga jelek) perilaku Javascript.
Peter Krauss
1
Ini bukan tempat untuk mengomel tentang bahasa tertentu. Menunjukkan apa yang PHP lakukan saat ini, dan cara menonaktifkannya, akan lebih membantu, dan sekarang telah ditambahkan jawaban yang melakukannya .
IMSoP