JSONパーサのコードに関するメモ2 : JavaScript

Pocket

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.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。