JSON.parse($.parseJSON)でエラーが出たときは特殊文字の混合を疑う

問題

PHPで生成したJSONをMcryptで暗号化し、base64エンコードしたものをJavaScriptでデコードしようとしたところ、JSON.parseでエラーが発生した

原因

JSON文字列の前後に特殊文字(改行コード等)が入っていたため、エラーが発生していた。

まったく同じ内容のJSON文字列をコピー&ペーストでJSON.parseに渡すとエラーもなく処理がされるため、頭を抱えることに。

このページの内容が解決のヒントに。

javascript - Uncaught SyntaxError: Unexpected token with JSON.parse - Stack Overflow

ポイント

console.logでは特殊文字が可視化されないため、注意が必要。

解決策

JSON.parseの前に各特殊文字をreplace関数で除去する 以下のコードは上記サイトから引用。

// preserve newlines, etc - use valid JSON
s = s.replace(/\\n/g, "\\n")  
.replace(/\\'/g, "\\'")
.replace(/\\"/g, '\\"')
.replace(/\\&/g, "\\&")
.replace(/\\r/g, "\\r")
.replace(/\\t/g, "\\t")
.replace(/\\b/g, "\\b")
.replace(/\\f/g, "\\f");

// remove non-printable and other non-valid JSON chars
s = s.replace(/[\u0000-\u0019]+/g,""); 

var o = JSON.parse(s);