JavaScript でプレーンデータを JSON 文字列に変換するサンプル
Ajax でクライアント/サーバ間を JSON でやり取りしたかったので、プレーンデータを JSON 文字列に変換する関数を書いてみた。
ちなみに prototype.js には Object の拡張として toJSON() が定義されている。jQuery はプラグインとして存在する。
今回は単体の関数として引数にデータを渡すように書いてみた。
function toJSON(data){ if (data === undefined) return; if (data === null) return "null"; var type = typeof data; if (type == 'number' || type == 'boolean') { return data.toString(); } else if (type == 'function' || type == 'unknown') { return; } else if (type == 'string' || data.constructor == String) { return '"' + data.replace(/\"|\n|\\/g, function(c){ return c == "\n" ? "\\n" : '\\' + c }) + '"'; } else if (data.constructor == Date) { return 'new Date("' + data.toString() + '")'; } else if (data.constructor == Array) { var items = []; for (var i = 0; i < data.length; i++) { var val = toJSON(data[i]); if (val != undefined) items.push(val); } return "[" + items.join(",") + "]"; } else if (data.constructor == Object) { var props = []; for (var k in data) { var val = toJSON(data[k]); if (val != undefined) props.push(toJSON(k) + ":" + val); } return "{" + props.join(",") + "}"; } }
Function は出力しない。Date 型は eval したときに Date オフジェクト化するようにコンストラクトコードになっている。RFC 4627 (http://www.ietf.org/rfc/rfc4627.txt) では日付に関する定義はないので、この変換はサーバ側の JSON ジェネレータ/パーサーに合わせたい。
String のエスケープ処理が足りていなかったのを修正しました。(2008/07/09)