JSON anahtarları tırnak işaretleri içine alınmalı mı?


235

Örnek: Aşağıdaki kod JSON Spec için geçerli mi?

{
    precision: "zip"
}

Yoksa her zaman aşağıdaki sözdizimini mi kullanmalıyım? (Ve eğer öyleyse, neden?)

{
    "precision": "zip"
}

JSON teknik özelliklerinde bu konuda gerçekten bir şey bulamadım. Her ne kadar örneklerinde anahtarları etrafında tırnak işareti kullanıyorlarsa da.

Yanıtlar:


147

Evet, tırnak işaretlerine ihtiyacınız var. Bu, daha basit hale getirmek ve javascript ayrılmış anahtar kelimeler için başka bir kaçış yöntemine sahip olmaktan kaçınmaktır {for:"foo"}.


12
Tırnaklar elle düzenlenen yapılandırma dosyaları gibi birçok durumda daha basit değildir. JSON'un neredeyse evrensel bir değişim formatı olarak kullanılması (ve yanlış kullanılması) ile ilgili talihsiz şey, Javascript'e özgü özelliklere sahip olmasıdır.
miguel

12
Gerçek sebep - bu yanıtı da kontrol et - stackoverflow.com/questions/4201441/…
TechMaze

3
Tl; dr: Ayrılmış anahtar kelimeler (anahtarsız) için ECMAScript sınırlamasıyla anahtar olarak uğraşmak istemediler, bu yüzden tüm anahtarları alıntılamak istediler.
BallpointBen

136

Anahtar olarak dizeleri kullanmak doğru. İşte RFC 4627'den bir alıntı - JavaScript Nesne Gösterimi için uygulama / json Media Type (JSON)

2.2. Nesneler

Bir nesne yapısı, sıfır veya daha fazla ad / değer çiftini (veya üyeyi) çevreleyen bir çift süslü parantez olarak temsil edilir. Ad bir dizedir . Her addan sonra, adı değerden ayıran tek bir iki nokta üst üste gelir. Tek bir virgül, bir değeri aşağıdaki addan ayırır. Bir nesnenin içindeki adlar benzersiz olmalıdır.

object = begin-object [ member *( value-separator member ) ] end-object

member = string name-separator value

[...]

2.5. Teller

Dizelerin temsili, C programlama dilleri ailesinde kullanılan sözleşmelere benzer. Bir dize tırnak işaretleri ile başlar ve biter. [...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

RFC'nin tamamını buradan okuyun .


11
Ve düşünce bitirmek için, bölüm 2.5 diyor: A string begins and ends with quotation marks..
rakslice

13

Gönderen 2.2. Nesneler

Bir nesne yapısı, sıfır veya daha fazla ad / değer çiftini (veya üyeyi) çevreleyen bir çift süslü parantez olarak temsil edilir. Ad bir dizedir.

ve 2.5. Teller

Bir dize tırnak işaretleri ile başlar ve biter.

Bu yüzden standarda göre şunu söyleyebilirim: evet, her zaman anahtarı alıntılamalısınız (bazı ayrıştırıcılar daha affedici olsa da)


7

Evet, alıntılar zorunludur. http://json.org/ diyor ki:

string
    ""
    " chars "

0

Evet onlar yapar. Ancak başka türlü ihtiyacınız varsa, JSON5'e göz atın .

JSON5 , aşağıdakiler de dahil olmak üzere ES5 sözdizimine izin veren bir JSON süper kümesidir:

  • alıntılanmamış özellik anahtarları
  • tek tırnaklı, çıkış karakterli ve çok satırlı dizeler
  • alternatif sayı biçimleri
  • yorumlar
  • ekstra boşluk

JSON5 referans uygulama ( json5NPM paket ) bir sağlar JSON5sahip olan nesneyi parseve stringifydahili aynı args ve semantik yöntemler JSONnesne.


-2

"Parent.child" noktalı gösterimini ekleyebileceğiniz ve aynı zamanda geçerli ve kullanışlı olan üst ["child"] öğesini koymak zorunda olmadığınız için, her iki yolun da teknik olarak kabul edilebilir olduğunu söyleyebilirim. Ayrıştırıcıların hepsi her iki yolu da gayet iyi yapmalıdır. Ayrıştırıcınız tuşlar üzerinde tırnak işareti gerektirmiyorsa, büyük olasılıkla onları yerleştirmemek daha iyidir (yerden tasarruf sağlar). Onları dizeler olarak adlandırmak mantıklıdır, çünkü oldukları şey budur ve köşeli parantezler, anahtarlar için değerleri kullanma yeteneği sağladığından, mükemmel bir anlam ifade etmemektedir. Json'da koyabilirsiniz ...

>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};

>obj
Object {someKey: "someValue"}

sadece sorunsuz bir anahtar için bir değere ihtiyacınız varsa ve alıntı yapılan hiçbiri işe yaramazsa, eğer işe yaramazsa, yapamazsınız, bu yüzden "anahtarlar üzerinde tırnak gerekmez" olmaz. Teknik olarak ip olduklarını söylemek doğru olsa bile. Mantık ve kullanım aksini iddia eder. Ayrıca herhangi bir tarayıcının konsolundan çalıştırdığımız örnekteki obj için {{someKey ":" someValue "} nesnesini resmi olarak çıkarmaz.


2
Hem kabul edilen cevap hem de JSON'u tanımlayan RFC, tırnak işaretlerinin gerekli olduğunu belirtir.
Keith Thompson

Bu doğrudur, ancak mantıksal olarak gerekmediğini belirtmeye değer. Tüm tarayıcı konsollarından bir JavaScript Nesne Notasyonu çıktısının yanlış olduğunu düşünüyorum ve birisine bunu düzeltmesini söylemeliyiz. Belki bir tarayıcı konsolu bir nesne için çıktı ne JSON değil, bu yüzden spec tanımlandığı gibi belki JSON çoğu yerde gerekli değildir veya bu şekilde uygulanır. Her neyse, sadece olayı yapmak istedim, bu gerçeklere farklı bir ışıkta bakıyor. Gerçekten belki spec değiştirilmelidir, "Alıntı Anahtarlar" sadece benim için önemli olan hiçbir yerde gerekli değildir. (Uygulamada bu şekilde kullanılmaz.)
Üstat James

2
Üç farklı şeyi karıştırıyorsunuz: JSON, JavaScript nesne değişmez değerleri ve tarayıcı geliştirici araçları konsol çıktısı. objKonsolunuza yazdığınızda , tarayıcı nesnenin insan tarafından okunabilir bir temsilini görüntüler. Nesneyi değişmez bir nesne olarak görüntüleyebilir (örneğinizde olduğu gibi) veya etkileşimli bile olsa başka bir gösterim kullanabilir. JavaScript, geçerli bir tanımlayıcıysa ve ayrılmış bir sözcük değilse, anahtar adı etrafında tırnak işareti gerektirmez. Ancak, JSON her zaman anahtar adları için tırnak işareti gerektirir.
Michael Geary

3
Daha fazla örnek olarak, objkonsola yazmak yerine deneyin JSON.stringify(obj). Şimdi, nesnenin alıntılanmış anahtar adıyla birlikte geçerli bir JSON temsilini göreceksiniz. Tersine, bir dizenin geçerli JSON olup olmadığını görmek için deneyin JSON.parse(string). Anahtarlar tırnak içine alınmazsa, bu bir istisna atar. Örneğin, JSON.parse('{"a":"b"}')başarılı olacak, ancak JSON.parse('{a:"b"}')başarısız olacak.
Michael Geary

1
OTOH, kullanımınız var obj = {[keyName]:"someValue"};çok ilginç! Bunu bir JavaScript nesnesi hazırlığında yapabileceğinizi bilmiyordum. Biraz kontrol, bunun ES6'da yeni bir şey olduğunu gösteriyor - ES5'te yapamadınız.
Michael Geary
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.