JSON anahtarları için alıntılanmış dizeleri kullanmanın pratik bir nedeni var mı?


88

Crockford'un json.org sitesine göre , bir JSON nesnesi çiftlerden oluşan üyelerden oluşur .

Her çift bir dizeden ve bir değerden oluşur ve bir dizge şu şekilde tanımlanır:

Dize, ters eğik çizgi kaçışları kullanılarak çift tırnak içine alınmış, sıfır veya daha fazla Unicode karakter dizisidir. Bir karakter, tek bir karakter dizisi olarak temsil edilir. Bir dize, C veya Java dizgisine çok benzer.

Ancak uygulamada çoğu programcı bir JSON anahtarının çift tırnak içine alınması gerektiğini bile bilmiyor, çünkü çoğu tarayıcı çift tırnak kullanılmasını gerektirmiyor.

JSON'nuzu çift tırnak içine almak mantıklı mı?

Geçerli Örnek:

{
  "keyName" : 34
}

Geçersiz olanın aksine:

{
   keyName : 34
}

20
"Neden bunu doğru yapmaya zahmet ettin?" Bu, geçersiz işaretlemeyle yüklü web sitelerine yol açan tembel düşünce türüdür. Geleceğe dönük durumda kodunuzu bazı tarayıcı gelmez çift tırnak gerektirir.
meagar

21
"Neden bunu doğru yapmaya zahmet ettin?" - Gerçek bir fayda yoksa, neden başka hiç kimsenin yapmadığı bir sözleşmeye uymaya çalışalım? Belki tembel düşünceyi pragmatizmle karıştırırsınız.
Mark Rogers

15
@Mark - "kimsenin yapmadığı" ... bu fikri nereden aldın? her büyük platformda yerleşik olan JSON serileştiricisi , uygun fiyat teklifleri verir.
Nick Craver

7
@Mark Rogers PHP json_encode işlevi, örneğin çift tırnaklı dizelerle geçerli JSON üretir. Belki JavaScript'te nesne değişmezlerini düşünüyorsunuz? Bunların anahtarlardan alıntı yapmadan çalıştığı doğru, ancak bu JSON değil.
JAL

9
Kayıt için, yıllar önce bunu yayınladığımda, JSON ile @JAL'in önerdiği gibi nesne değişmez gösterimi arasındaki fark konusunda kafam karışmıştı. İkisinin çok benzer bir sözdizimi var, bu nihayetinde sorunu açıklarken bazı karışıklıklara yol açtı.
Mark Rogers

Yanıtlar:


157

JSON anahtarlarının neden tırnak içinde olması gerektiğinin gerçek nedeni, ECMAScript 3'ün Tanımlayıcılarının anlambilimine dayanır.

Ayrılmış sözcükler , Nesne Değişmezlerinde tırnak işaretleri olmadan özellik adları olarak kullanılamaz , örneğin:

({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...

Tırnak kullanırsanız, özellik adları geçerlidir:

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok

Kendi Crockford bunu bu konuşmada açıklıyor , JSON standardını basit tutmak istiyorlardı ve tüm bu anlamsal kısıtlamalara sahip olmak istemiyorlardı:

....

İşte o zaman, alıntılanmamış isim problemini keşfettik. Görünüşe göre ECMA Script 3, rezerve edilmiş bir kelime politikasına sahip. Ayrılmış kelimelerin anahtar konumda alıntılanması gerekir ki bu gerçekten bir sıkıntıdır. Bunu bir standart haline getirmeye başladığımda, tüm ayrılmış kelimeleri standarda koymak zorunda kalmak istemedim çünkü bu gerçekten aptalca görünürdü.

O zamanlar insanları ikna etmeye çalışıyordum: evet, JavaScript'te uygulamalar yazabilirsiniz, aslında işe yarayacak ve bu iyi bir dil. Öyleyse aynı anda söylemek istemedim: ve yaptıkları şu aptalca şeye bak! Ben de bunun yerine anahtarları aktarmaya karar verdim.
Bu şekilde, ne kadar saçma olduğunu kimseye söylememize gerek kalmaz.

Bu nedenle, bu güne kadar anahtarlar JSON'da alıntılanıyor.

...

ECMAScript 5th Edition Standard bunu, şimdi bir ES5 uygulamasında düzeltir, ayrılmış kelimeler bile hem Nesne değişmezlerinde hem de üye erişiminde ( obj.functionES5'te Ok) tırnak işaretleri olmadan kullanılabilir .

Kayıt için, bu standart bugünlerde yazılım satıcıları tarafından uygulanmaktadır, bu uyumluluk tablosunda bu özelliği hangi tarayıcıların içerdiğini görebilirsiniz ( Özellik adları olarak ayrılmış sözcüklere bakın )


1
@Mark, rica ederim. JSON'un, sözdizimi Javascript Nesne Değişmez sözdiziminden esinlenmiş olsa bile , sadece dilden bağımsız bir veri değişim formatı olduğunu unutmayın, aralarında farklar vardır (yalnızca alıntılanan anahtarlardan çok daha fazlası).
Christian C. Salvadó

2
@CMS, Öyleyse neden sadece çift tırnak olmak zorunda? JSON'da neden tek tırnaklar geçersiz?
Pacerier

1
JSON standardını olabildiğince basit tutmak için tek tırnak işaretlerine izin verilmiyor. JSON'un yalnızca Javascript'in bir alt kümesi olması gerekir, Javascript'i olabildiğince fazla uygulamasına gerek yoktur.
thomasrutter

JSON5 Spec süperset ES5 sözdizimi uyar ve böylece diğer şeyler arasında tırnaksız anahtarlarını destekler. Kitaplığın uyumlu parseve stringifyyöntemleri vardır.
Inigo

Bu uyumluluk tablosu bağlantısında (cevabın altında ) Ayrılmış sözcükler girişi Nesne / dizi değişmez uzantılar bölümünün altındadır . Ve TL; DR, listelenen tüm tarayıcılar (tüm duyduğunuz ve yaklaşık 20 tane daha) hepsi "Evet" diyor.
i336_

17

Evet, bu geçersiz JSON ve çoğu durumda reddedilecektir, örneğin jQuery 1.4+, alıntılanmamış JSON'u sessizce başarısız kılan bir kontrol içerir. Neden değil uyumlu olması?

Başka bir örnek alalım:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }

... tüm bunlar alıntılarla geçerli olur , neden tutarlı olmasın ve her durumda bunları kullanmayasınız ki problem olasılığını ortadan kaldıralım?

Web geliştirici dünyasında daha yaygın bir örnek: Çoğu tarayıcıda işlenen binlerce geçersiz HTML örneği var ... bu, hata ayıklamayı veya bakımını daha az zahmetli hale getiriyor mu? Hiç de değil, tam tersi.

Ayrıca @ Matthew aşağıdaki yorumlarda en iyi noktayı ortaya koyuyor, bu zaten başarısız oluyor, alıntılanmamış tuşlar JSON.parse()tüm büyük tarayıcılarda (ve bunu doğru şekilde uygulayan diğer tüm tarayıcılarda) bir sözdizimi hatası atacak , burada test edebilirsiniz .


Evet, schonky json sunucu tarafı oluşturan bazı eski ajax uygulamalarım vardı, anahtar adlarının etrafında çift tırnak bulunmadığından jquery 1.4'e yükseltildiğinde başarısız oldu.
JAL

Tüm büyük tarayıcıların JSON.parseda doğru bir şekilde reddedeceğini eklemek isteyebilirsiniz .
Matthew Flaschen

Merak ediyorum, hangi durumda JQuery 1.4 bu tür geçersiz json ile sessizce başarısız olur?
Mark Rogers

1
@Mark - Her halükarda doğru şekilde alıntılanmamıştır veya geçersiz karakterler içerir ... temelde herhangi bir geçersiz JSON ile başarısız olur.
Nick Craver

Bu ilginç, JQuery 1.4 ile olan deneyimim olmadı. Ayrıca, json nesnelerinin oluşturulmasından jquery'nin sorumlu olduğunu düşünmüyorum, tarayıcının javascript yorumlayıcısının yaptığı şey bu değil mi? Jquery json serisini kaldırma işleminden mi bahsediyorsunuz?
Mark Rogers

-4

Aslında bir JSON üst kümesi olan YAML, yapmak istediklerinizi destekliyor. AL Bir süper set olmasına rağmen, istediğiniz kadar basit tutmanıza izin verir.

YAML bir temiz hava soluğudur ve bir göz atmak için zaman ayırmaya değer olabilir. Başlamak için en iyi yer burası: http://en.wikipedia.org/wiki/YAML

JS dahil olmak üzere güneşin altındaki her dil için kütüphaneler vardır, örneğin https://github.com/nodeca/js-yaml


11
YAML, JSON'un bir üst kümesi değildir.
John Gibb

neden hakkında bilgi için: stackoverflow.com/questions/25974485/…
Ben Page
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.