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

don-bra.co

さいきんはphpとたわむれてます

JSON.parse()したときにSyntaxErrorが出るときの対処法

javascriptでモヤモヤしたお話です。

JSON.parse()でSyntaxError

とあるweb APIの戻り値がjsonだったので、これを取得しようとしていました。エンドポイントにGETリクエストしてJSON.parse()するとなぜかエラー。
何度parseしてもSyntaxError: Unexpected end of inputが出続けます。

色々と試行錯誤していると、どうやらjavascriptJSON.parse()はかなり厳密な文字列でないと受け付けてくれないようです。

はまりがちなparse不可の文字列

今回parseに失敗していた原因は\バックスラッシュでした。
バックスラッシュや特殊な文字列(ダブルクォートなど)をparseしたいときは\\\"のようにエスケープする必要があります。

あと文字列のクォートが''シングルクォートでもエラー SyntaxError: JSON Parse error: Single quotes (') are not allowed in JSON が発生します。なんてナイーブな子なんだろう。。

var str = "{'id': 123}"
JSON.parse(str) // Exception: SyntaxError: JSON Parse error: Single quotes (') are not allowed in JSON

jsさんがお怒りです。

evalでも落とし穴

受け取り側でごにょごにょするのも、大層なアプリではないのでevalを使おうと思ったところ、evalでもエラーに。。 evalでJSONをparseしたいときはparseする文字列を()でくくるのが定番らしいです。

var str = '{"id": 123}'
var json = eval("(" + str + ")")

ただ、今回はこれでもダメでした。。
返ってきたエラーはSyntaxError: Unexpected token ILLEGALでした。 むむむと思ってまず調べてみると、parseできない改行コードが含まれていることが原因でした。

php-tips.com

これは事前にreplaceするのがいいようです。

data.replace(/\u2028|\u2029/g, '');

jsでJSONのパースをする際はハマりやすいのでご注意ください。

参考サイト

JSON | JavaScript プログラミング解説

d.hatena.ne.jp

arshavin0909.hateblo.jp

qiita.com