Tulis program yang menentukan apakah inputnya JSON yang valid .
Input: teks ASCII:
[\x00-\x7F]*
Catatan: jika ASCII bermasalah, silakan gunakan pengkodean lain, tetapi tunjukkan dalam posting Anda.
Keluaran:
Valid
atauInvalid
. Mengejar baris baru dapat dihilangkan.Contoh:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate Invalid
Aturan:
- Jangan gunakan parsing pustaka JSON.
- Solusi yang sebagian benar diizinkan, tetapi disukai.
- Posting skor test suite Anda (lihat di bawah).
The terpendek yang benar menang solusi.
Silakan jalankan json-validate-test-suite.sh di program Anda, dan poskan skor Anda. Contoh:
$ ./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
Sumber:
- json.org - Definisi ringkas tata bahasa JSON dengan gambar yang mudah diikuti.
- RFC 4627 - Spesifikasi JSON
- json-validate.c - Implementasi 200-line yang lolos dari testuite.
Tata bahasa JSON adalah sebagai berikut:
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]+)?
Juga, spasi putih dapat muncul sebelum atau sesudah salah satu dari enam karakter struktural {}[]:,
ws = [\t\n\r ]*
Ingatlah yang berikut:
- Hati-hati dengan fungsi seperti
isspace()
. Spasi di JSON adalah[\t\n\r ]
, tetapiisspace()
juga memperlakukan\v
(tab vertikal) dan\f
(form feed) sebagai ruang. Meskipun ada kata yangisdigit()
dapat menerima lebih dari sekadar[0-9]
, seharusnya boleh digunakan di sini, karena kami menganggap input ada di ASCII. \x7F
secara teknis karakter kontrol, tetapi JSON RFC tidak menyebutkannya (hanya menyebutkannya[\x00-\x1F]
), dan sebagian besar parser JSON cenderung menerima\x7F
karakter dalam string. Karena ambiguitas ini, solusi dapat memilih untuk menerimanya atau tidak.
{key: "value"}
menganggap JSON tidak valid? Itu adalah javascript yang valid.Jawaban:
PHP:
297285264253 karakterskor: 300/300
Ini adalah implementasi penuh, tata bahasa JSON tata bahasa.
Ini hanya bekerja pada PHP ≥ 5.3 karena sintaks nowdoc (heredoc akan diperlukan untuk menggandakan semua
\
).Versi yang dapat dibaca:
(ini adalah regex yang sama, dengan kelompok tangkapan bernama dan sintaks yang diperluas):
sumber
<?php
IMO.Python -
340314299292 karakterskor
sumber
Scala - 390 karakter
Ini adalah no-brainer soluton, menggunakan pengurai parser. Ditulis dalam 1 atau 2 menit, secara harfiah. Tidak dapat memperoleh skrip validator, browser mengatakan server itu tidak ditemukan.
sumber