JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
に掲載されているJSONパーサの詳細な日本語コメント付きコードが下記の記事に掲載されている。
» JavaScriptをやり始めた人が理解したほうが良いJSONパーサのコード
処理の流れを掴むために機能を大幅に制限したコード。
// JSONをJavaScriptのオブジェクトへ変換する
// JSONのデータは下記のように制限する
// プロパティ名は英小文字(a-z)の文字型のみ
// 値は英小文字(a-z)の文字型かオブジェクトリテラル{}のみ
// JSONの例 {“x”: “abc”}’や{“x”: {“y”: “abc”}}
// reviver関数は省略
// エラー処理なし
var limit_json_parse = (function() {
var at; // 現在の文字のインデックス
var ch; // 現在の文字
var text; // JSONデータを保管
var next = function(c) { // インデックスを1文字進めて現在の文字を返す
if (c && c !== ch) {
return false;
}
ch = text.charAt(at);
at += 1;
return ch;
};
var white = function(c) {
// ホワイトスペースを無視する関数
// ‘ ‘はUnicodeコードポイント0032(16進数)
while (ch && ch <= ' ') {
next();
}
};
var string = function() {
// 文字列の処理
var string = '';
if (ch === '"') {
while (next()) {
if (ch === '"') {
next();
return string;
} else {
string += ch;
}
}
}
error("Bad string");
};
var object = function() {
// オブジェクトを解析する関数
var key, object = {};
if (ch === '{') {
next('{');
white();
if (ch === '}') {
next('}');
return object; // 空のオブジェクト
}
while (ch) { // オブジェクトを構築
key = string(); // keyは文字列型のみなのでstring関数を直接実行
white();
next(':');
object[key] = value(); // 値は文字型かオブジェクトなのでvalue関数を実行
white();
if (ch === '}') {
next('}');
return object;
}
next(',');
white();
}
}
return false;
};
var value = function() {
// JSONの値を解析する関数
// 型(オブジェクトか文字列のどちらか)に応じて対応する関数を実行
// object関数から再帰。
white();
switch (ch) {
case '{':
return object();
case '"':
return string();
default:
return false;
}
};
// 無名のクロージャー
return function(source) {
// 変換されたオブジェクトを格納
var result;
// JSONデータを格納
text = source;
// 初期化処理
at = 0;
ch = ' ';
// 変換
result = value();
return result;
};
}());
// 実行
console.log(limit_json_parse('{"foo": {"bar": "baz"}}'));[/javascript]
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。