จงเขียนโปรแกรมที่กำหนดว่าการป้อนข้อมูลของมันคือการที่ถูกต้องJSON
อินพุต:ข้อความ ASCII:
[\x00-\x7F]*หมายเหตุ: หาก ASCII มีปัญหาคุณสามารถใช้การเข้ารหัสอื่นได้ แต่ระบุไว้ในโพสต์ของคุณ
ขาออก หรือ
ValidInvalidอาจขึ้นบรรทัดใหม่ที่ส่วนท้ายตัวอย่าง:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate Invalidกฎ:
- อย่าใช้ไลบรารีการแยกวิเคราะห์ JSON
- อนุญาตโซลูชันที่ถูกต้องเพียงบางส่วน แต่ยังขมวดคิ้วอยู่
- โพสต์คะแนนชุดทดสอบของคุณ (ดูด้านล่าง)
ที่สั้นที่สุดที่ถูกต้องชนะการแก้ปัญหา
โปรดเรียกใช้json-validate-test-suite.shในโปรแกรมของคุณและโพสต์คะแนนของคุณ ตัวอย่าง:
$ ./json-validate-test-suite.sh ./buggy-prog
fail: should be invalid: [ 0.1e ]
fail: should be invalid: [ 0.1e+-1 ]
fail: should be invalid: [ 0.1e-+1 ]
score: 297/300
แหล่งข้อมูล:
- json.org - คำจำกัดความที่รัดกุมของไวยากรณ์ JSON พร้อมรูปภาพที่ติดตามได้ง่าย
- RFC 4627 - ข้อกำหนด JSON
- json-validate.c - การใช้งาน 200 บรรทัดที่ผ่านการทดสอบไซต์
ไวยากรณ์ JSON มีดังนี้:
json: object | array
object: '{' members? '}'
members: pair (',' pair)*
pair: string ':' value
array: '[' elements? ']'
elements: value (',' value)*
value: string
| number
| object
| array
| 'true'
| 'false'
| 'null'
string: '"' char* '"'
char: [^"\\\x00-\x1F]
| '\' escape
escape: ["\\/bfnrt]
| u [0-9A-Fa-f]{4}
number: '-'? (0 | [1-9][0-9]*) ('.' [0-9]+)? ([Ee] [+-]? [0-9]+)?
นอกจากนี้ช่องว่างสามารถปรากฏก่อนหรือหลังอักขระโครงสร้างหกตัวใดก็ได้ {}[]:,
ws = [\t\n\r ]*
จำไว้ดังต่อไปนี้:
isspace()ระมัดระวังกับการทำงานเช่น ช่องว่างใน JSON คือ[\t\n\r ]แต่isspace()ยังถือว่า\v(แท็บแนวตั้ง) และ\f(ฟีดฟอร์ม) เป็นพื้นที่ แม้ว่า word มีคำที่isdigit()สามารถยอมรับได้มากกว่าเพียงแค่[0-9]ควรใช้ที่นี่เนื่องจากเราถือว่าข้อมูลเป็น ASCII\x7Fในทางเทคนิคเป็นอักขระควบคุม แต่ JSON RFC ไม่ได้พูดถึงมัน (เป็นเพียงการกล่าวถึง[\x00-\x1F]) และตัวแยกวิเคราะห์ JSON ส่วนใหญ่มักจะยอมรับ\x7Fอักขระในสตริง เนื่องจากความกำกวมนี้โซลูชันอาจเลือกที่จะยอมรับหรือไม่เลือก
{key: "value"}JSON ถึงไม่ถูกต้อง เป็นจาวาสคริปต์ที่ถูกต้อง