มีเหตุผลที่เป็นประโยชน์ในการใช้สตริงที่ยกมาสำหรับคีย์ JSON หรือไม่


88

ตาม Crockford ของjson.orgเป็น JSON วัตถุถูกสร้างขึ้นจากสมาชิกซึ่งถูกสร้างขึ้นจากคู่

ทุกคู่ประกอบด้วยสตริงและค่าโดยมีการกำหนดสตริงเป็น:

สตริงคือลำดับของอักขระ Unicode ที่เป็นศูนย์หรือมากกว่าซึ่งรวมอยู่ในเครื่องหมายคำพูดคู่โดยใช้เครื่องหมายแบ็กสแลช Escape อักขระแสดงเป็นสตริงอักขระเดี่ยว สตริงก็เหมือนกับสตริง C หรือ Java

แต่ในทางปฏิบัติโปรแกรมเมอร์ส่วนใหญ่ไม่รู้ด้วยซ้ำว่าคีย์ JSON ควรอยู่ในเครื่องหมายอัญประกาศคู่เพราะเบราว์เซอร์ส่วนใหญ่ไม่จำเป็นต้องใช้เครื่องหมายคำพูดคู่

มันสมเหตุสมผลหรือไม่ที่จะรบกวน JSON ของคุณในเครื่องหมายคำพูดคู่?

ตัวอย่างที่ถูกต้อง:

{
  "keyName" : 34
}

ตรงข้ามกับไม่ถูกต้อง:

{
   keyName : 34
}

20
“ จะไปยุ่งทำไมล่ะ” นี่คือความคิดขี้เกียจที่นำไปสู่เว็บไซต์ที่เต็มไปด้วยมาร์กอัปที่ไม่ถูกต้อง หลักฐานในอนาคตรหัสของคุณในกรณีที่เบราว์เซอร์บางอย่างไม่ต้องใช้คำพูดสอง
meagar

21
“ จะไปยุ่งทำไมล่ะ” - ทำไมต้องกังวลที่จะปฏิบัติตามอนุสัญญาที่ไม่มีใครทำถ้าไม่มีประโยชน์จริง ๆ ? บางทีคุณอาจสับสนระหว่างความคิดขี้เกียจกับหลักการปฏิบัติ
Mark Rogers

15
@ มาร์ค - "ที่ไม่มีใครทำ" ... เอาความคิดนั้นมาจากไหน? JSON serializer ที่ติดตั้งไว้ในทุกแพลตฟอร์มหลักจะทำการอ้างอิงอย่างเหมาะสม
Nick Craver

7
@Mark Rogers ฟังก์ชัน PHP json_encode สร้าง JSON ที่ถูกต้องพร้อมด้วยสตริงที่ยกมาสองครั้ง บางทีคุณอาจกำลังคิดถึง object literals ใน JavaScript? จริงอยู่ว่าสิ่งเหล่านั้นทำงานได้โดยไม่ต้องอ้างคีย์ แต่นั่นไม่ใช่ JSON
JAL

9
สำหรับบันทึกเมื่อหลายปีก่อนเมื่อฉันโพสต์สิ่งนี้ฉันรู้สึกสับสนเกี่ยวกับความแตกต่างระหว่าง JSON และสัญกรณ์ตัวอักษรตามที่ @JAL แนะนำ ทั้งสองมีไวยากรณ์ที่คล้ายกันมากซึ่งทำให้เกิดความสับสนในการอธิบายปัญหาในที่สุด
Mark Rogers

คำตอบ:


157

เหตุผลที่แท้จริงว่าทำไมคีย์ JSON ควรอยู่ในเครื่องหมายคำพูดขึ้นอยู่กับความหมายของตัวระบุของ ECMAScript 3

ไม่สามารถใช้คำสงวนเป็นชื่อคุณสมบัติใน Object Literals โดยไม่มีเครื่องหมายคำพูดตัวอย่างเช่น:

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

แม้ว่าคุณจะใช้เครื่องหมายคำพูดชื่อคุณสมบัติจะถูกต้อง:

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

Crockford ของตัวเองอธิบายไว้ในการพูดคุยนี้พวกเขาต้องการรักษามาตรฐาน JSON ให้เรียบง่ายและไม่ต้องการมีข้อ จำกัด ด้านความหมายทั้งหมด:

....

นั่นคือตอนที่เราค้นพบปัญหาชื่อที่ไม่ได้อ้างถึง ปรากฎว่า ECMA Script 3 มีนโยบายตีคำสงวน คำสงวนจะต้องถูกยกมาในตำแหน่งสำคัญซึ่งเป็นเรื่องที่น่ารำคาญจริงๆ เมื่อฉันเริ่มกำหนดสิ่งนี้ให้เป็นมาตรฐานฉันไม่ต้องการให้คำสงวนทั้งหมดอยู่ในมาตรฐานเพราะมันจะดูโง่จริงๆ

ตอนนั้นฉันพยายามโน้มน้าวผู้คนใช่คุณสามารถเขียนแอปพลิเคชันใน JavaScript มันใช้งานได้จริงและเป็นภาษาที่ดี ฉันไม่อยากจะพูดในเวลาเดียวกัน: และดูสิ่งที่โง่เขลาจริงๆที่พวกเขาทำ! ดังนั้นฉันจึงตัดสินใจว่าเรามาพูดถึงคีย์แทน
แบบนั้นเราไม่ต้องบอกใครหรอกว่ามันตีกันยังไง

นั่นเป็นเหตุผลที่จนถึงทุกวันนี้คีย์จึงถูกยกมาใน JSON

...

ECMAScript 5th Edition Standard แก้ไขสิ่งนี้ในการใช้งาน ES5 แม้กระทั่งคำสงวนก็สามารถใช้ได้โดยไม่ต้องใส่เครื่องหมายคำพูดทั้งในตัวอักษร Object และการเข้าถึงของสมาชิก ( obj.functionตกลงใน ES5)

สำหรับการบันทึกมาตรฐานนี้ถูกนำไปใช้ในปัจจุบันโดยผู้จำหน่ายซอฟต์แวร์คุณสามารถดูว่าเบราว์เซอร์ใดรวมคุณลักษณะนี้ไว้ในตารางความเข้ากันได้นี้ (ดูคำสงวนเป็นชื่อคุณสมบัติ )


1
@ คุณมาร์คยินดีต้อนรับ โปรดทราบว่า JSON เป็นเพียงรูปแบบการแลกเปลี่ยนข้อมูลที่ไม่เชื่อเรื่องพระเจ้าแม้ว่าไวยากรณ์ของมันจะได้รับแรงบันดาลใจจากไวยากรณ์ Javascript Object Literal แต่ก็มีความแตกต่างระหว่างกัน (มากกว่าเพียงแค่คีย์ที่ยกมา)
Christian C. Salvadó

2
@CMS ทำไมต้องเป็นแค่เครื่องหมายคำพูดคู่? เหตุใดเครื่องหมายคำพูดเดี่ยวจึงไม่ถูกต้องใน JSON
Pacerier

1
ไม่อนุญาตให้ใช้เครื่องหมายคำพูดเดี่ยวเพื่อให้มาตรฐาน JSON เรียบง่ายที่สุด JSON ต้องเป็นเพียงส่วนย่อยของ Javascript เท่านั้นไม่จำเป็นต้องใช้ Javascript ให้มากที่สุด
thomasrutter

JSON5 superset ข้อมูลจำเพาะปฏิบัติตามไวยากรณ์ ES5 จึงสนับสนุนคีย์ unquoted หมู่สิ่งอื่น ๆ ห้องสมุดมีเข้ากันได้parseและstringifyวิธีการ
Inigo

ในการเชื่อมโยงตารางเข้ากันได้ที่ (ที่ด้านล่างของคำตอบที่น) สงวนคำเข้าอยู่ภายใต้วัตถุ / อาร์เรย์ที่แท้จริงส่วนขยายส่วน และ TL; DR เบราว์เซอร์ในรายการทั้งหมด (ทั้งหมดที่คุณเคยได้ยินและอีกประมาณ 20 รายการ) ทั้งหมดพูดว่า "ใช่"
i336_

17

ใช่ JSON ไม่ถูกต้องและจะถูกปฏิเสธในหลาย ๆ กรณีเช่น jQuery 1.4+ มีการตรวจสอบที่ทำให้ JSON ที่ไม่ได้ใส่เครื่องหมายคำพูดล้มเหลวโดยไม่โต้ตอบ ทำไมไม่ปฏิบัติตาม?

ลองดูอีกตัวอย่าง:

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

... สิ่งเหล่านี้จะสามารถใช้งานได้ด้วยคำพูดว่าทำไมไม่ให้สอดคล้องและใช้พวกเขาในทุกกรณีการขจัดความเป็นไปได้ของปัญหาหรือไม่

อีกหนึ่งตัวอย่างที่พบบ่อยในโลกของนักพัฒนาเว็บ: มีตัวอย่างของ HTML ที่ไม่ถูกต้องหลายพันตัวอย่างที่แสดงผลในเบราว์เซอร์ส่วนใหญ่ ... นั่นทำให้การดีบักหรือการดูแลรักษาเจ็บปวดน้อยลงหรือไม่? ไม่เลยตรงกันข้ามทีเดียว

นอกจากนี้ยัง @ แมทธิวทำให้จุดที่ดีที่สุดของทั้งหมดในความคิดเห็นด้านล่างนี้แล้วล้มเหลวคีย์ unquoted จะโยนความผิดพลาดทางไวยากรณ์กับJSON.parse()เบราว์เซอร์ที่สำคัญทั้งหมด (และอื่น ๆ ที่ใช้มันอย่างถูกต้อง) คุณสามารถทดสอบได้ที่นี่


ใช่ฉันมีแอพ ajax เก่า ๆ ที่สร้างฝั่งเซิร์ฟเวอร์ schonky json ซึ่งล้มเหลวเมื่ออัปเกรดเป็น jquery 1.4 เนื่องจากไม่มีเครื่องหมายคำพูดคู่รอบชื่อคีย์
JAL

คุณอาจต้องการเพิ่มว่าเบราว์เซอร์หลัก ๆ ทั้งหมดJSON.parseจะปฏิเสธอย่างถูกต้องด้วย
Matthew Flaschen

ฉันสงสัยว่าในกรณีใด JQuery 1.4 จะล้มเหลวอย่างเงียบ ๆ กับ json ที่ไม่ถูกต้องประเภทนี้
Mark Rogers

1
@Mark - ไม่ว่าในกรณีใดก็ตามมันไม่ได้ยกมาอย่างถูกต้องหรือมีอักขระที่ไม่ถูกต้อง ... โดยพื้นฐานแล้วมันจะล้มเหลวด้วย JSON ที่ไม่ถูกต้อง
Nick Craver

ที่น่าสนใจนั่นไม่ใช่ประสบการณ์ของฉันกับ JQuery 1.4 นอกจากนี้ฉันไม่คิดว่า jquery มีหน้าที่ในการสร้างวัตถุ json นั่นไม่ใช่สิ่งที่ตัวแปลจาวาสคริปต์ของเบราว์เซอร์ทำหรือไม่? คุณกำลังอ้างถึง Jquery json deserialization หรือไม่?
Mark Rogers

-4

YAML ซึ่งในความเป็นจริงแล้วเป็นส่วนเหนือของ JSON รองรับสิ่งที่คุณต้องการทำ แม้ว่ามันจะเป็นชุดซูเปอร์เซ็ต แต่ก็ช่วยให้คุณเก็บไว้ได้ง่ายอย่างที่คุณต้องการ

YAML คือการสูดอากาศบริสุทธิ์และอาจคุ้มค่ากับเวลาที่คุณจะได้ดู จุดเริ่มต้นที่ดีที่สุดคือhttp://en.wikipedia.org/wiki/YAML

มี libs สำหรับทุกภาษาภายใต้ดวงอาทิตย์รวมถึง JS เช่นhttps://github.com/nodeca/js-yaml


11
YAML ไม่ใช่ส่วนเหนือของ JSON
John Gibb

สำหรับข้อมูลเกี่ยวกับเหตุผล: stackoverflow.com/questions/25974485/…
Ben Page
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.