Viết chương trình xác định xem đầu vào của nó có phải là JSON hợp lệ hay không .
Đầu vào: văn bản ASCII:
[\x00-\x7F]*
Lưu ý: nếu ASCII có vấn đề, vui lòng sử dụng mã hóa khác, nhưng chỉ ra nó trong bài viết của bạn.
Đầu ra:
Valid
hoặcInvalid
. Trailing dòng mới có thể được bỏ qua.Thí dụ:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate Invalid
Quy tắc:
- Không sử dụng thư viện phân tích cú pháp JSON.
- Các giải pháp đúng một phần được cho phép, nhưng nhăn mặt.
- Gửi điểm số bộ thử nghiệm của bạn (xem bên dưới).
Các ngắn nhất đúng thắng giải pháp.
Vui lòng chạy json-validate-test-suite.sh trên chương trình của bạn và gửi điểm số của bạn. Thí dụ:
$ ./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
Tài nguyên:
- json.org - Định nghĩa ngắn gọn về ngữ pháp JSON với các hình ảnh dễ theo dõi.
- RFC 4627 - Đặc tả JSON
- json-validate.c - Một triển khai 200 dòng vượt qua testsuite.
Ngữ pháp JSON như sau:
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]+)?
Ngoài ra, khoảng trắng có thể xuất hiện trước hoặc sau bất kỳ trong sáu ký tự cấu trúc {}[]:,
ws = [\t\n\r ]*
Hãy ghi nhớ những điều sau:
- Cẩn thận với các chức năng như
isspace()
. Khoảng trắng trong JSON là[\t\n\r ]
, nhưngisspace()
cũng coi\v
(tab dọc) và\f
(nguồn cấp dữ liệu biểu mẫu) là không gian. Mặc dù từ nàyisdigit()
có thể chấp nhận nhiều hơn là[0-9]
, nhưng sẽ ổn khi sử dụng ở đây, vì chúng tôi giả sử đầu vào là ở ASCII. \x7F
về mặt kỹ thuật là một ký tự điều khiển, nhưng JSON RFC không đề cập đến nó (nó chỉ đề cập đến[\x00-\x1F]
) và hầu hết các trình phân tích cú pháp JSON có xu hướng chấp nhận các\x7F
ký tự trong chuỗi. Vì sự mơ hồ này, các giải pháp có thể chọn chấp nhận chúng hoặc không.
{key: "value"}
coi JSON không hợp lệ? Nó là javascript hợp lệ.