Koo*_*Inc 3 javascript parsing json
我已经盯着这里找到的代码了很长时间.这是Douglas Crockfords JSON解析函数(称为递归下降解析器).任何人都可以详细说明这个解析器的机制吗?我真的无法理解它.
从逻辑上讲,您可以从第311行开始的实际解析函数开始(为清楚起见,省略了接收器部分).
function (source, reviver) {
var result;
text = source;
at = 0;
ch = ' ';
result = value();
white();
if (ch) {
error("Syntax error");
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
使用text源文本初始化函数全局变量,at使用位置初始化位置,ch使用空格初始化当前字符.之后它通过调用函数来解析一个值value.
要解析的每个对象都封装在一个函数本身中(在上面的例子中是值对象).有几种人:number,string,white,...).每个人基本上都以相同的方式工作.首先,我们将white看作基本的例子:
white = function () {
// Skip whitespace.
while (ch && ch <= ' ') {
next();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,chconstains始终是当前字符.此变量仅next在下一个读取时更新.这可以white在每个空格被调用的地方看到next.因此,在调用此函数后,第一个非空格字符将处于变量中ch.
让我们来寻找一个更复杂的例子value:
value = function () {
// Parse a JSON value. It could be an object, an array, a string, a number,
// or a word.
white();
switch (ch) {
case '{':
return object();
case '[':
return array();
case '"':
return string();
case '-':
return number();
default:
return ch >= '0' && ch <= '9' ? number() : word();
}
};
Run Code Online (Sandbox Code Playgroud)
它首先通过调用来解析空格white.请注意,ch现在包含要解析的当前字符.如果它是'{'我们现在将接下来的json对象并调用相应的函数object.相反,它是'['我们期望的json数组等等.
所有其他函数都以相同的方式构建:检查当前字符,确定接下来要做什么,然后解析此对象.
对象本身可以包含其他值,因此你会发现功能的间接递归调用value的object一次.因此,通过递归调用所有json对象函数,它们实际上是从源字符串中解析的.
| 归档时间: |
|
| 查看次数: |
1373 次 |
| 最近记录: |