JSON: Neden eğik çizgiler kaçtı?


369

Bunun nedeni "kaçar".

JSON , eğik çizgiden kaçar, böylece bir karma yerine yerine {a: "a/b/c"}serileştirilir .{"a":"a\/b\/c"}{"a":"a/b/c"}

Neden?


4
FWIW JSON'da hiç eğik çizgi görmedim, sadece code.google.com/p/json-simple
Jason S

24
PHP json_encode()varsayılan olarak ileri eğik çizgilerden kaçar, ancak JSON_UNESCAPED_SLASHESPHP 5.4.0'dan (Mart 2012) itibaren başlayan seçeneğe sahiptir
Walter Tross

6
İşte her eğik çizgiden '</'echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
kaçmayacak

Kod '</' içeriyor mu: yoksa echo ile mi başlıyor? Çünkü echo'dan başlamak benim için başarısız oluyor. Sadece bir şey alamadım. Evet
Değişkem

JSON hiçbir şeyden kaçmaz veya serileştirmez ... JSON serileştiriciniz yapar. Hangisini kullanıyorsun?
Yörüngedeki Hafiflik Yarışları

Yanıtlar:


284

JSON bunu yapmanızı gerektirmez, bunu yapmanızı sağlar. Ayrıca "A" için "\ u0061" kullanmanızı sağlar, ancak zorunlu değildir. İzin vermek , JSON'u Seb'in işaret ettiği gibi iç dizelere izin vermeyen \/bir <script>etikete gömerken yardımcı olur </.

Microsoft'un ASP.NET Ajax / JSON API'lerinden bazıları, ek bilgi eklemek için bu boşluk deliğini kullanır; örneğin, bir datetime olarak gönderilir "\/Date(milliseconds)\/". (İğrenç)


4
Bu iyi bir şey olurdu, sadece </. Yine de JSON genellikle komut dosyası etiketlerine gömülmez.
Ruben

8
ASP.NET JSON tarih biçimi için mantık için bu blog gönderisine bakın: weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Michiel van Oosterhout

25
JSON serileştiricisinin belirli bir uygulaması ( tamamen geçerli JSON olsa da ) bazı ekstra karakterlere sahip olduğu için bazı JSON çıktıları verir , böylece bir JS komut dosyası olarak bir HTML komut dosyası öğesine bırakılabilir mi ?! Bu, bebeği banyo suyuyla dışarı atmak kadar değil, bebeği dışarı atmak, çünkü birisi ona bir dizi su kanadı satın aldı.
Quentin

15
Ne alamadım, bir JSON serileştirici neden JSON nerede biter umurumda olmasıdır. Web sayfasında, HTTP isteğinde, her neyse. Son oluşturucunun, gerekiyorsa ek kodlama yapmasına izin verin.
Dan Ross

5
@DanRoss Ve olabilir. Kaçış /değil gerekli o olduğu, izin JSON kullanımını kolaylaştırmak için. Eğer kaçmak istemiyorsan, kaçma /.
Andreas

35

JSON spec, eğik çizgiden kaçabileceğinizi söylüyor, ancak zorunda değilsiniz.


9
Söz konusu bölüme bir bağlantı ekleyebilir misiniz?
Ryan Gates

1
Spesifikasyon bunu söylemiyor. Aslında tek söylediği şey, solidus karakterinden kaçmak zorunda olduğunuz. Bkz. Ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Joa Ebert

10
@JoaEbert: Ters bir solidus kaçmalı, ancak bir solidustan kaçmanıza gerek yok. Bölüm 9, "Kaçması gereken karakterler hariç tüm karakterler tırnak içine alınabilir: tırnak işareti (U + 0022), ters katı (U + 005C) ve U + 0000 - U + 001F kontrol karakterleri. "
Harold L

4
Teşekkürler Harold! Haklısınız, Şekil 5'te de "dışında herhangi bir kod noktası" olarak gösterildiği gibi, / isteğe bağlı olduğunu açıkça belirtirsiniz.
Joa Ebert

15

Aynı soruyu bir süre önce sordum ve kendim cevaplamak zorunda kaldım. İşte ben geldim:

Görünüşe göre, ilk düşüncem [ JavaScript köklerinden geliyor ] doğruydu.

'\/' === '/'JavaScript ve JSON olduğunu geçerli bir JavaScript. Ancak, diğer yoksayılan kaçışlara (örneğin \z) JSON'da neden izin verilmiyor?

Bunun için anahtar okuyordu http://www.cs.tut.fi/~jkorpela/www/revsol.html ardından http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 . Eğik çizgi kaçış özelliği JSON HTML (SGML olarak) ve XML gömülü sağlar.


5
Yapılandırılmış bir veri yükü dağıtım mekanizması dil yapılarına bağlı olmamalıdır ... bu gelecekte değişebileceği gibi ... ancak JSON yaratıcılarından herhangi biri varsa tasarım kararlarını açıklayabilir.

'\ /' === '/' Jsonp'imi alırken eğik çizgilerin önünü açmam gerekmiyor mu?
Timmetje

8

PHP varsayılan olarak eğik çizgilerden kaçar , bu yüzden muhtemelen bu kadar yaygın görünür. Neden olduğundan emin değilim, ama muhtemelen "</script>"bir <script>etiketin içine dize gömmek güvensiz kabul edilir çünkü .

Bu işlevsellik JSON_UNESCAPED_SLASHESbayrağı ileterek devre dışı bırakılabilir, ancak orijinal sonuç zaten geçerli JSON olduğundan çoğu geliştirici bunu kullanmaz.


5

Çirkin PHP!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESOlmalı varsayılan değil, bir (garip) seçeneği ... Nasıl php-geliştiriciler bunu söylemek?

Varsayılan En sık kullanım olacak ve UTF8 (güncel) en yaygın olarak kullanılan standartlar GEREKİR. Github'da veya başka bir yerde kaç tane PHP kodu parçası bu exoctic "HTML'ye gömülü" özelliğe ihtiyaç duyar?


2
Doğru dedi! Bununla birlikte, PHP, tüm dünyaya bir haşere gibi yayılan tüm bu bozuk tarihi PHP parçacıklarındaki ortak önceki hatalardan herhangi birini kırmamak için gelecekteki tüm tuhaf hatalarını teşvik eder. Bu nedenle PHP tarafından alınan tüm bu yanlış kararlar, yani PHP hakkındaki neredeyse tüm kararlar standart haline gelir. Standartların değişmesini bekleyemezsiniz, bu nedenle her bir PHP geliştiricisi PHP'de bulunan tüm bu ciddi hatalara karşı sonsuz sayıda geçici çözümü bilmeli ve uygulamalıdır. Stackoverflow girin ..
Tino

Tamamen yanılıyorsun. JavaScript nedeniyle. Aşağıda belirtildiği gibi. JS'de '\/' === '/'true değerini döndürür. Gerçeklere bağlı kalmanızı tavsiye ederim. Çoğu insan birkaç tutarsız işlev adıyla başa çıkabilir. Geçmişi görememenizin nedeni PHP'yi kötü bir araç yapmaz.
Cobolt

1
Merhaba @Cobolt, Eski bir soru, ben bugün PHP kullanmıyorum ... Ama, tartışma blogu olarak, çekirdek "Varsayılan en sık kullanılan OLMALIDIR" , bu yüzden çirkinlik bu "en sık kullanım" görmezden Javascript (aynı zamanda çirkin) davranışı.
Peter Krauss

1
Herhangi bir dil hakkında rant yapılacak yer burası değil. PHP'nin şu anda ne yaptığını ve nasıl devre dışı bırakılacağını göstermek daha yararlı olurdu ve şimdi bunu yapan bir cevap eklendi .
IMSoP
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.