อักขระใดที่ถูกต้อง / ไม่ถูกต้องในชื่อคีย์ JSON


151

มีอักขระต้องห้ามในชื่อคีย์สำหรับวัตถุ JavaScript หรือสตริง JSON หรือไม่ หรือตัวละครที่ต้องหลบหนี

หากต้องการเฉพาะเจาะจงมากขึ้นฉันต้องการใช้ "$", "-" และช่องว่างในชื่อคีย์


ฉันคิดว่าคำตอบบางส่วนเกี่ยวข้องกับวิธีการเข้ารหัสของคุณ ตัวอย่างเช่น UTF8 มีอักขระต่างกันที่อนุญาตเทียบกับ ANSI
invalidsyntax

4
คุณสามารถใช้ 'คีย์' ใด ๆ ที่คุณต้องการใน JS โดยใช้obj['whatever']สัญลักษณ์ แต่สามารถใช้เฉพาะคีย์ตัวเลขและตัวอักษรสำหรับobj.whateverรุ่น
Marc B

4
@invalidsyntax: JSON เป็น Unicode ตามคำจำกัดความ นอกจากนี้ ANSI ไม่ใช่การเข้ารหัส แต่เป็นชุดอักขระดังนั้นการเปรียบเทียบควรเป็น Unicode-vs-ANSI ไม่ใช่ UTF-8-vs-ANSI
Marcelo Cantos

1
การสนทนาเก่า แต่ ASCII (สิ่งที่ผู้คนมักอ้างถึงโดย ANSI) คือการเข้ารหัสและนอกเหนือจากนั้นยังกำหนดชุดอักขระ
ตรินิแดด

คำตอบ:


167

ไม่สตริงที่ถูกต้องใด ๆ เป็นคีย์ที่ถูกต้อง มันสามารถมีได้"ตราบเท่าที่คุณหลบหนี:

{"The \"meaning\" of life":42}

อาจมีโอกาสที่คุณจะประสบปัญหาในการโหลดค่าดังกล่าวในบางภาษาซึ่งพยายามเชื่อมโยงคีย์กับชื่อฟิลด์วัตถุ อย่างไรก็ตามฉันไม่ทราบกรณีดังกล่าว


ขอบคุณ! ตัวละครอื่น ๆ ที่จะต้องหลบหนี? กดไลค์: หรือ; ?
Christophe

11
ไม่ใช่พวกนั้น สิ่งที่ต้องการหลบหนีใน JavaScript โดยทั่วไปต้องการใน JSON ดีที่สุดที่จะได้รับจากปากม้าแม้ว่าที่ json.org ใช้เวลาประมาณหนึ่งนาทีในการอ่านข้อมูลจำเพาะจากต้นจนจบ
Marcelo Cantos

3
นี่ไม่ใช่คำตอบที่ดี อักขระประเภทใดที่ต้องหลบหนี ตัวละครใดที่สามารถหลบหนีได้ แต่ไม่ต้องหลบหนี
Daniel W.

ทุกคนสามารถอธิบายได้หรือไม่ถ้าสิ่งนี้รวมถึงสิ่งต่าง ๆ เช่นอักขระ Unicode null (U + 0000, ธรรมดา "null byte" ใน UTF-8) ฯลฯ ทั้งjson.orgและ PDF ของข้อกำหนด ECMA ที่เป็นทางการ / เป็นทางการที่เชื่อมโยงดูเหมือนจะบอกเป็นนัยว่าใช่สิ่งเหล่านั้นใช้ได้ใน JSON แม้จะอยู่ในรูปแบบตัวอักษร (ไม่ใช่แค่ใน\u four-hex-digitsรูปแบบ)
mtraceur

1
@OutofOrbit คุณสามารถโหลดมันลงใน Object ที่ไม่มีการพิมพ์ได้หรือไม่?
Marcelo Cantos

54

อักขระต่อไปนี้ต้องถูกหลีกเลี่ยงในข้อมูล JSON เพื่อหลีกเลี่ยงปัญหาใด ๆ

'คำพูดเดียว

” คำพูด

\ backslash

อักขระควบคุมทั้งหมดเช่น \ n \ t

JSON Parserสามารถช่วยคุณจัดการกับ JSON

แก้ไข: ต่อไปนี้เป็นตัวแยกวิเคราะห์ JSON เนื่องจากลิงก์ของ OP ไม่ทำงาน


5
สวัสดีอรุณคำพูดเดียวไม่จำเป็นต้องหลบหนี Infact การหลบหนีจะทำให้ตัวแยกวิเคราะห์ JSON เข้มงวดโยนข้อยกเว้น อ้างถึงส่วนสตริงของjson.orgแน่นอนว่าคุณจะต้องหลีกเลี่ยงเมื่ออยู่ในสตริง JSON (แต่ไม่ใช่ JSON เอง)
Alex KeySmith

5
@AlexKey คุณพูดถูก! อรุณคุณสามารถตรวจสอบได้ที่jsonlint.comโดยทดสอบ JSON { "singlequotetest": "something here isn\'t right"}กับ{ "singlequotetest": "Fixing here what wasn't right"}
Adrien Be

@ Run Rana - ไม่ต้องกังวล
Alex KeySmith

3
{"* ~ @ # $% ^ & * () _ + => <? /": "เป็น json ที่ถูกต้อง"}
Abhi

45
{"🐶🔫": "not nice, but still valid json"}
Marcelo Cantos

12

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

ตัวอย่าง:

var testObject = {
    "1tile": "test value"
};
console.log(testObject.1tile); // fails, invalid syntax
console.log(testObject["1tile"]; // workaround

6
ฉันหวังว่าในปี 2017/18 อายุของ Microsoft พวกเขารู้สึกเสียใจกับความเจ็บปวดทั้งหมดที่เกิดขึ้น
monsto

1
ดูที่พารามิเตอร์รหัสตัวชี้วัดของพวกเขา: dev.applicationinsights.io/apiexplorer/ ...... --- 15 หรือ 20 ของเขตข้อมูลของพวกเขามีหลายทับไปข้างหน้าในชื่อเขต json ของพวกเขา ในขณะที่วิธีแก้ปัญหา Karns ใช้งานได้กับเขตข้อมูลที่เฉพาะเจาะจงฉันไม่สามารถทำให้มันทำงานได้สำหรับ 1 สาขาย่อย เช่นจุดที่ตามมากลับไม่ได้กำหนดสำหรับฉัน
Jon Luzader

ทำไม IE ถึงกล่าวถึงตรงนั้น ตัวระบุที่ขึ้นต้นด้วยตัวเลขนั้นผิดกฎหมายในทุกการใช้งาน ECMAScript
m93a

@ m93a IE ไม่ได้แปลว่าเป็นตัวย่อสำหรับ Internet Explorer ... คำที่ไม่ถูกต้อง: /
karns

นี่ควรเป็นคำตอบที่ดีที่สุด
Joe Elia

7

ต้องหลีกเลี่ยง Unicode codepoints U + D800 ถึง U + DFFF: ไม่ถูกต้องใน Unicode เนื่องจากถูกสงวนไว้สำหรับคู่ตัวแทน UTF-16 ตัวเข้ารหัส / ถอดรหัส JSON บางตัวจะแทนที่ด้วย U + FFFD ดูตัวอย่างว่าภาษา Go และไลบรารี JSON ของมันจัดการกับพวกเขาอย่างไร

ดังนั้นหลีกเลี่ยง "\ uD800" ถึง "\ uDFFF" เพียงอย่างเดียว (ไม่ใช่ในคู่ตัวแทน)

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