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)