คีย์ JSON ต้องล้อมรอบด้วยเครื่องหมายคำพูดหรือไม่?


235

ตัวอย่าง: รหัสต่อไปนี้ใช้ได้กับJSON Specหรือไม่

{
    precision: "zip"
}

หรือฉันควรใช้ไวยากรณ์ต่อไปนี้เสมอ? (และถ้าเป็นเช่นนั้นทำไม)

{
    "precision": "zip"
}

ฉันไม่พบอะไรเกี่ยวกับสิ่งนี้ในข้อมูลจำเพาะ JSON แม้ว่าพวกเขาจะใช้เครื่องหมายคำพูดรอบ ๆ คีย์ในตัวอย่าง

คำตอบ:


147

ใช่คุณต้องมีเครื่องหมายคำพูด {for:"foo"}นี้คือการทำให้มันง่ายขึ้นและเพื่อหลีกเลี่ยงการมีวิธีการหลบหนีอีกจาวาสคริปต์คำหลักที่สงวนไว้คือ


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

12
เหตุผลที่แท้จริง - ตรวจสอบคำตอบนี้ด้วย - stackoverflow.com/questions/4201441/…
TechMaze

3
Tl; dr: พวกเขาไม่ต้องการที่จะจัดการกับข้อ จำกัด ECMAScript สำหรับคำหลักที่สงวนไว้ (ไม่ต้องใส่เครื่องหมายคำพูด) เป็นกุญแจดังนั้นพวกเขาเพียงต้องการ quoting กุญแจทั้งหมด
BallpointBen

136

คุณถูกต้องเพื่อใช้สตริงเป็นคีย์ นี่คือข้อความที่ตัดตอนมาจากRFC 4627 - ชนิดของแอ็พพลิเคชัน / json Media Type สำหรับ JavaScript Object Notation (JSON)

2.2 วัตถุ

โครงสร้างวัตถุถูกแสดงเป็นคู่ของวงเล็บปีกกาที่ล้อมรอบคู่ชื่อ / ค่าเป็นศูนย์หรือมากกว่า (หรือสมาชิก) ชื่อเป็นสตริง เครื่องหมายโคลอนเดียวมาหลังชื่อแต่ละชื่อโดยแยกชื่อออกจากค่า เครื่องหมายจุลภาคเดียวคั่นค่าจากชื่อต่อไปนี้ ชื่อภายในวัตถุควรเป็นชื่อเฉพาะ

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

member = string name-separator value

[ ... ]

2.5 เงื่อนไข

การเป็นตัวแทนของสตริงคล้ายกับข้อตกลงที่ใช้ในตระกูล C ของภาษาการเขียนโปรแกรม สตริงเริ่มต้นและสิ้นสุดด้วยเครื่องหมายคำพูด [ ... ]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

อ่าน RFC ทั้งที่นี่


11
และจะเสร็จสิ้นการคิดส่วน 2.5 A string begins and ends with quotation marks.พูดว่า:
rakslice

13

จาก2.2 วัตถุ

โครงสร้างวัตถุถูกแสดงเป็นคู่ของวงเล็บปีกกาที่ล้อมรอบคู่ชื่อ / ค่าเป็นศูนย์หรือมากกว่า (หรือสมาชิก) ชื่อคือสตริง

และจาก2.5 เงื่อนไข

สตริงเริ่มต้นและสิ้นสุดด้วยเครื่องหมายคำพูด

ดังนั้นฉันจะบอกว่าตามมาตรฐาน: ใช่คุณควรพูดคีย์เสมอ (แม้ว่า parsers บางคนอาจให้อภัยมากกว่า)


7

ใช่ต้องมีการเสนอราคา http://json.org/พูดว่า:

string
    ""
    " chars "

0

ใช่. แต่ถ้าคุณต้องการอย่างอื่นเช็คเอาท์JSON5

JSON5เป็นชุดของ JSON ที่อนุญาตให้ใช้ไวยากรณ์ ES5 ได้แก่ :

  • คีย์คุณสมบัติที่ไม่มีเครื่องหมายอัญประกาศ
  • สตริงที่ยกมาเดี่ยวหลบหนีและหลายบรรทัด
  • รูปแบบตัวเลขอื่น
  • แสดงความคิดเห็น
  • ช่องว่างพิเศษ

การประยุกต์ใช้การอ้างอิง JSON5 ( json5แพ็กเกจ npm ) จัดเตรียมJSON5อ็อบเจ็กต์ที่มีparseและstringifyเมธอดที่มี args และ semantics เดียวกันกับJSONอ็อบเจ็กต์ในตัว


-2

เนื่องจากคุณสามารถใส่เครื่องหมาย "parent.child" และคุณไม่จำเป็นต้องใส่ parent ["child"] ซึ่งเป็นสิ่งที่ถูกต้องและมีประโยชน์ฉันจึงบอกว่าทั้งสองวิธีนี้เป็นที่ยอมรับในทางเทคนิค ตัวแยกวิเคราะห์ทั้งหมดควรทำทั้งสองวิธี หาก parser ของคุณไม่จำเป็นต้องใส่เครื่องหมายคำพูดลงบนกุญแจก็น่าจะดีกว่าที่จะไม่ใส่มัน (ประหยัดพื้นที่) มันสมเหตุสมผลที่จะเรียกมันว่าสตริงเพราะนั่นคือสิ่งที่พวกเขาเป็นและเนื่องจากวงเล็บเหลี่ยมให้ความสามารถในการใช้ค่าสำหรับคีย์เป็นหลักจึงไม่เหมาะสม ใน Json คุณสามารถ ...

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

>obj
Object {someKey: "someValue"}

ใช้ได้โดยไม่มีปัญหาหากคุณต้องการค่าสำหรับคีย์และไม่มีการยกมาจะไม่ทำงานดังนั้นถ้าไม่คุณไม่สามารถดังนั้นคุณจะไม่ดังนั้น "คุณไม่ต้องการคำพูดในคีย์" แม้ว่ามันจะถูกต้องที่จะบอกว่ามันเป็นสายเทคนิค ตรรกะและการใช้งานโต้แย้งอย่างอื่น และไม่ส่งออกอย่างเป็นทางการ Object {"someKey": "someValue"} สำหรับ obj ในตัวอย่างของเราที่รันจากคอนโซลของเบราว์เซอร์ใด ๆ


2
ทั้งคำตอบที่ยอมรับและ RFC ที่กำหนด JSON กล่าวว่าจำเป็นต้องใช้เครื่องหมายคำพูด
Keith Thompson

นั่นเป็นความจริง แต่มันก็คุ้มค่าที่จะสังเกตว่ามันไม่จำเป็นต้องมีเหตุผล ฉันคิดว่าเอาต์พุต JavaScript Object Notation จากคอนโซลของเบราว์เซอร์ทั้งหมดนั้นผิดและเราควรบอกใครสักคนให้แก้ไข บางทีสิ่งที่คอนโซลของเบราว์เซอร์แสดงผลสำหรับวัตถุนั้นไม่ใช่ JSON ดังนั้น JSON อาจเป็นเพราะข้อกำหนดที่กำหนดไม่จำเป็นหรือไม่ได้นำไปใช้ในสถานที่ส่วนใหญ่ อย่างไรก็ตามฉันแค่ต้องการที่จะทำให้กรณีที่ดูข้อเท็จจริงในแง่ที่แตกต่างกัน จริงๆแล้วข้อมูลจำเพาะควรจะเปลี่ยนไป "คีย์ที่ยกมา" ก็ไม่จำเป็นต้องใช้ทุกที่ที่สำคัญกับฉันเป็นการส่วนตัว (มันไม่ได้ใช้ในทางปฏิบัติเช่นนั้น)
ท่านอาจารย์เจมส์

2
คุณกำลังผสมสามสิ่งที่แตกต่างกัน: JSON, ตัวอักษรออบเจ็กต์ JavaScript และเอาต์พุตคอนโซลเครื่องมือสำหรับนักพัฒนาเบราว์เซอร์ เมื่อคุณพิมพ์objในคอนโซลเบราว์เซอร์จะแสดงวัตถุที่มนุษย์สามารถอ่านได้ มันอาจแสดงเป็นวัตถุตามตัวอักษร (เช่นในตัวอย่างของคุณ) หรืออาจใช้การแทนแบบอื่นบางอย่างแม้แต่แบบโต้ตอบ จาวาสคริปต์วัตถุตัวอักษรไม่จำเป็นต้องมีเครื่องหมายคำพูดล้อมรอบชื่อคีย์หากคีย์นั้นเป็นตัวระบุที่ถูกต้องและไม่ใช่คำที่สงวนไว้ อย่างไรก็ตาม JSON มักจะต้องใช้คำพูดรอบชื่อคีย์
Michael Geary

3
เป็นตัวอย่างต่อไปแทนการพิมพ์ในคอนโซลให้ลองobj JSON.stringify(obj)ตอนนี้คุณจะเห็นการแสดงวัตถุ JSON ที่ถูกต้องพร้อมด้วยชื่อคีย์ที่ยกมา ตรงกันข้ามเพื่อดูว่าสตริงเป็น JSON JSON.parse(string)ที่ถูกต้องลอง หากไม่ได้ใส่กุญแจจะเป็นการยกเว้น ตัวอย่างเช่นJSON.parse('{"a":"b"}')จะประสบความสำเร็จ แต่JSON.parse('{a:"b"}')จะล้มเหลว
Michael Geary

1
OTOH การใช้งานของคุณvar obj = {[keyName]:"someValue"};น่าสนใจมาก! ฉันไม่ทราบว่าคุณสามารถทำได้ในตัวอักษรวัตถุ JavaScript การตรวจสอบเล็กน้อยแสดงให้เห็นว่านี่เป็นสิ่งใหม่ใน ES6 - คุณไม่สามารถทำได้ใน ES5
Michael Geary
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.