読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

JSON、8進数

クライアントサイドでjQueryを使う場合にサーバが返すJSONで気をつけないといけないこと - 文殊堂を見て興味が湧いたので調べた。

まず、0123のように、0以外で先頭が0の数値はJSONとして不正である。

2.4. Numbers
(略)
Octal and hex forms are not allowed. Leading zeros are not allowed.
(略)
int = zero / ( digit1-9 *DIGIT )

http://www.ietf.org/rfc/rfc4627.txt?number=4627

実装については、まちまちである。
例えばJSON.parse("0123")を評価すると、IE8とWebKit(r45311)ではSyntaxErrorが投げられる。
Firefox(20090617のナイトリー)では、123になる。
http://www.json.org/json2.js:json2.jsGoogle Chrome(3.0.191)では、83になる。

6. IANA Considerations
(略)
var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
eval('(' + text + ')');

http://www.ietf.org/rfc/rfc4627.txt?number=4627

このコードは、安全でないソースコードがevalされないようにするための物であり、JSONとして不正である物を全て検出できるわけではないので注意するべきだ。そもそも、JavaScript正規表現だけではJSONのような再帰的な構造を持つ文字列は一度にパースできない。

JSON.parseをvalidatorとして使用することはできないので気をつけよう。