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);