อาร์เรย์สามารถเป็นข้อความ JSON ระดับบนสุดได้หรือไม่


คำตอบ:


126

ใช่อาร์เรย์ถูกกฎหมายในฐานะ JSON-text ระดับบนสุด

มีสามเอกสารมาตรฐานกำหนด JSON คือ: RFC 4627 , RFC 7159 (ซึ่ง obsoletes RFC 4627) และECMA-404 พวกเขาแตกต่างกันที่องค์ประกอบระดับบนสุดที่อนุญาต แต่ทั้งหมดอนุญาตให้ออบเจ็กต์หรืออาร์เรย์เป็นองค์ประกอบระดับบนสุด

  • RFC 4627: วัตถุหรืออาร์เรย์
    "ข้อความ JSON คือออบเจ็กต์หรืออาร์เรย์ที่ทำให้เป็นอนุกรม"
  • RFC 7159: ค่า JSON ใด ๆ
    "ข้อความ JSON เป็นค่าซีเรียลไลซ์"
  • ECMA-404: ค่า JSON ใด ๆ
    "ข้อความ JSON คือลำดับของโทเค็นที่สร้างจากจุดโค้ด Unicode ที่สอดคล้องกับไวยากรณ์ค่า JSON"

2
ในฐานะของRFC ที่ใหม่กว่านี้ "ข้อความ JSON เป็นลำดับของสัญญาณได้. ชุดของสัญญาณรวมถึงหกตัวละครโครงสร้างสตริง, ตัวเลขและสามชื่อที่แท้จริง."
antak

64

ใช่แต่คุณควรพิจารณาการทำรากวัตถุแทนในบางสถานการณ์เนื่องจากJSON หักหลัง นี่คือช่องโหว่ในการเปิดเผยข้อมูลโดยอาศัยการแทนที่ตัวสร้างอาร์เรย์ใน JavaScript


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

9
FWIW, JSON หักหลังไม่เป็นปัญหาสำหรับเบราว์เซอร์ที่ทันสมัย
Franklin Yu

4

นี่มาจากข้อกำหนด ECMAScript

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber

1
นี่เป็นเพียงเล็กน้อยที่ทำให้เข้าใจผิดเนื่องจาก ECMAScript อนุญาตให้คุณแยกวิเคราะห์สตริง JSON ที่ไม่ใช่ข้อความระดับบนสุด ตาม RFC "ข้อความ JSON คือวัตถุหรืออาร์เรย์ที่ต่อเนื่องกัน"
Matthew Flaschen

@ แมทธิว - แปลกฉันสงสัยว่าคร็อกฟอร์ดรู้สึกอย่างไรกับเรื่องนั้น พวกเขาจะกระทบความแตกต่างระหว่าง RFC และ ECMA อย่างไร
ChaosPandion

3
ฉันเพียงแค่มองและพบว่าพวกเขาตระหนักถึงความแตกต่าง จาก ECMAScript 5 §15.12 "การสร้าง JSONText ระดับบนสุดของไวยากรณ์ ECMAScript JSON อาจประกอบด้วย JSONValue ใด ๆ แทนที่จะถูก จำกัด ให้เป็น JSONObject หรือ JSONArray ตามที่ RFC 4627 ระบุ" ไม่รู้ว่า IETF จะเปลี่ยน RFC หรือเปล่า
Matthew Flaschen

@ แมทธิว - ขอบคุณสำหรับสิ่งนั้นฉันรู้สึกสับสนอย่างมาก คำอธิบาย json.org ไม่ได้กล่าวถึงแนวคิดที่เข้มงวดมากขึ้นของ "json-text" เลยและประเภทของ RFC ก็คลุมเครือเกี่ยวกับความสำคัญของมัน
mrec

คำตอบนี้เกี่ยวกับ ECMAScript แต่คำถามเกี่ยวกับ JSON ขณะที่พวกเขา (จงใจ) มีลักษณะคล้ายพวกเขาจะมีรายละเอียดที่แตกต่างกัน
sleske

2

ใช่ลองดูที่นี่

http://www.jsonlint.com/

และใส่ [{}]


3
ง่ายกว่านั้นด้วยซ้ำ ใส่[]แล้วมันจะตรวจสอบได้
sorpigal

ลิงก์หมดแล้วโปรดอัปเดตหรือลบสิ่งนี้ - เกือบจะเป็นลิงก์เท่านั้น - คำตอบ
Anthon

1

มีความสับสนบางอย่างเห็นในความคิดเห็นอื่น ๆ ประเภท "application / JSON" สื่อช่วยให้วัตถุหรืออาร์เรย์เฉพาะในระดับบนสุดสำหรับ JSON ข้อความต่อJSON RFC อย่างไรก็ตามสำหรับตัวแยกวิเคราะห์ค่า JSON ใด ๆ ที่ยอมรับได้ดังที่เห็นในข้อกำหนด ECMAScript


ค่า JSON ใด ๆ ที่เป็นองค์ประกอบระดับบนสุดเป็นที่ยอมรับสำหรับตัวแยกวิเคราะห์ ECMAScriptแต่ไม่ใช่สำหรับตัวแยกวิเคราะห์ JSON (ที่เข้ากันได้) - ความแตกต่างที่สำคัญ
sleske

นั่นเป็นความแตกต่างที่น่าสนใจ แต่ฉันไม่เข้าใจที่คุณพูด คำจำกัดความของ "(compliant) JSON parser" คืออะไร
cdunn2001

1
ตัวแยกวิเคราะห์ JSON เป็นตัวแยกวิเคราะห์สำหรับไวยากรณ์ JSON แม้ว่า JSON จะมีลักษณะคล้ายกับ Javascript แต่ก็เป็นไวยากรณ์ที่แตกต่างกัน (ง่ายกว่ามาก) ดูtools.ietf.org/html/rfc7159ซึ่งอธิบายเกี่ยวกับไวยากรณ์ JSON "compliant" หมายถึงตัวแยกวิเคราะห์ตามหลักไวยากรณ์ (ซึ่งตัวแยกวิเคราะห์ที่เหมาะสมควรจะเป็น)
sleske

3
RFC 4627 ล้าสมัยแล้วโปรดอย่าติดตามอีกต่อไป RFC ใหม่ยังอนุญาตให้มีค่าพื้นฐานที่ระดับบนสุด
Matthias Dieter Wallnöfer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.