JSONを設定ファイル代わりに使う場合は JSON.parse → だめなら → eval のように二段階で評価するといいんじゃないかな
JSON.parse があまりにも眼鏡委員長なので、JSON.parse でエラーが出たら黒ギャル eval("(" + … + ")") で試す的なコードいれたらストレス減った
あ、さっきのJSONスタイルで書く設定ファイルのバリデーションの事ね。ユーザが設定ファイルにありがちなコメント( /* */ や // )いれてたり、 ハッシュの末尾のカンマ消し忘れてるだけでエラーで弾くのは忍びないので、 eval で jsとして評価して正しければOKでしょと
JSON を設定ファィル代わりに使うプロダクト多いけど、JSON.parse は些細なことでもエラーで弾くので、eval で評価して問題なければ、大抵はそれでいいと思うんだけど
JSON.parse('{ key: "value" }') は key を "key" にしないとエラーだけど、 eval("(" + '{ key: "value" }' + ")") は js として正しいので、ユーザが key を "key" とタイプしなかっただけでエラーになるストレスからも解放される
eval した後の object を JSON.stringify(object, "", 2); などで吐き出せば、2個スペースのインデント付きで正規化されたJSONになるので、ファイルをそれで上書きするか、正規化されたものを次回から使ってもらえば色々捗る的な
var fs = require("fs"); var minify = false; var json = validateJSON( fs.readFileSync("hoge.json", "UTF-8") ); fs.writeFileSync("hoge.json", minify ? JSON.stringify(json) : JSON.stringify(json, "", 2)); // JSON の評価を行う、JSON.parseでエラーになる場合は、jsとしてevalする function validateJSON(text) { var obj = null; try { obj = JSON.parse( text ); return obj; } catch (O_o) { ; } // try eval(text) try { obj = eval("(" + text + ")"); } catch (o_O) { console.log("ERROR. JSON.parse failed"); return null; } console.log("WARN. As a result of JSON.parse, a trivial problem has occurred"); return obj; // repaired }
(ε・◇・)з o O ( いいんじゃないかな!