<JavaScript语言精粹>JSON解析器源码阅读
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了<JavaScript语言精粹>JSON解析器源码阅读,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4859字,纯文字阅读大概需要7分钟。
内容图文
1 // 这是一个用JavaScript编写JSON解析器的实现方案: 2 var jsonParser = (function() { 3// 这是一个能把JSON文本解析成JavaScript数据结构的函数。 4// 它是一个简单的递归降序解析器。 5// 我们在另一个函数中定义此函数,以避免创建全局变量。 6 7var at, // 当前字符索引 8 ch, // 当前字符 9 escapee = { 10 ‘"‘: ‘"‘, 11 "\\": "\\", 12 "/": "/", 13 b: "b", 14 f: "\f", 15 n: "\n", 16 r: "\r", 17 t: "\t" 18 }, 19 text, 20 error = function(m) { 21// 当某处出错时,调用error。 22throw { 23 name: "SyntaxError", 24 messsage: m, 25 at: at, 26 text: text 27 }; 28 }, 29 next = function(c) { 30// 如果提供了参数 c, 那么检查它是否匹配当前字符。 31if (c && c !== ch) { 32 error("Expected ‘" + c + "‘ insttead of ‘" + ch + "‘"); 33 } 34 35// 获取下一个字符。当没有下一个字符时,返回一个空字符串。 36 ch = text.charAt(at); 37 at += 1; 38return ch; 39 }, 40 number = function() { 41// 解析一个数字值。 42var number, 43 string = ""; 44if (ch === "-") { 45 string = "-"; 46 next("-"); 47 } 48while (ch >= "0" && ch <= "9") { 49 string += ch; 50 next(); 51 } 52if (ch === ".") { 53 string += "."; 54while (next() && ch >= "0" && ch <= "9") { 55 string += ch; 56 } 57 } 58if (ch == "e" || ch == "E") { 59 string += ch; 60 next(); 61if (ch === "-" || ch === "+") { 62 string += ch; 63 next(); 64 } 65while (ch >= "0" && ch <= "9") { 66 string += ch; 67 next(); 68 } 69 } 70// reeser: 加一个字符串, 是一种技巧, 用于将字符串转换为数字 71 number = +string; 72if (isNaN(number)) { 73 error("Bad number"); 74 } else { 75return number; 76 } 77 }, 78 string = function() { 79// 解析一个字符串值。 80var hex, 81 i, 82 string = "", 83 uffff; 84// 当解析字符串值时,我们必须找到 " 和 \ 字符。 85if (ch === ‘"‘) { 86while (next()) { 87if (ch === ‘"‘) { 88 next(); 89return string; 90 } elseif (ch === "\\") { 91 next(); 92if (ch === "u") { 93 uffff = 0; 94for (i = 0; i < 4; i += 1) { 95 hex = parseInt(next(), 16); 96if (!isFinite(hex)) { 97break; 98 } 99 uffff = uffff * 16 + hex; 100 } 101 string += String.fromCharCode(uffff); 102 } elseif (typeof escapee[ch] === "string") { 103 string += escapee[ch]; 104 } else { 105break; 106 } 107 } else { 108 string += ch; 109 } 110 } 111 } 112 error("Bad string"); 113 }, 114 white = function() { 115// 跳过空白116// reeser: ascii表中, 小于等于32(空白字符)的,都属于空白字符117while (ch && ch <= " ") { 118 next(); 119 } 120 }, 121 word = function() { 122// true, false 或者 null123switch (ch) { 124case "t": 125 next("t"); 126 next("r"); 127 next("u"); 128 next("e"); 129returntrue; 130case "f": 131 next("f"); 132 next("a"); 133 next("l"); 134 next("s"); 135 next("e"); 136returnfalse; 137case "n": 138 next("n"); 139 next("u"); 140 next("l"); 141 next("l"); 142returnnull; 143 } 144 error("Unexpected ‘" + ch + "‘"); 145 }, 146 value, // 值函数的占位符。147 array = function() { 148// 解析一个数组值。149var array = []; 150if (ch === "[") { 151 next(‘[‘); 152 white(); 153if (ch === "]") { 154 next("]"); 155return array; // 空数组156 } 157while (ch) { 158 array.push(value()); 159 white(); 160if (ch === "]") { 161 next("]"); 162return array; 163 } 164 next(","); 165 white(); 166 } 167 } 168 error("Bad array"); 169 }, 170 object = function() { 171// 解析一个对象值172var key, 173 object = {}; 174if (ch === "{") { 175 next("{"); 176 white(); 177if (ch === "}") { 178 next("}"); 179return object; // 空对象180 } 181while (ch) { 182 key = string(); 183 white(); 184 next(":"); 185 object[key] = value(); 186 white(); 187if (ch === "}") { 188 next("}"); 189return object; 190 } 191 next(","); 192 white(); 193 } 194 } 195 error("Bad object"); 196 }; 197 value = function() { 198// 解析一个JSON值。它可以是对象、数组、字符串、数字或一个词。199 white(); 200switch (ch) { 201case "{": 202return object(); 203case "[": 204return array(); 205case ‘"‘: 206return string(); 207case "-": 208return number(); 209default: 210return ch >= "0" && ch <= "9" ? number() : word(); 211 } 212 }; 213// 返回json_parse 函数。它能访问上述所有的函数和变量。214returnfunction(source, reviver) { 215var result; 216 text = source; 217 at = 0; 218 ch = " "; 219 result = value(); 220 white(); 221if (ch) { 222 error("Syntax error"); 223 } 224225// 如果存在reviver 函数,我们就递归地对这个新结构调用walk函数,226// 开始时先创建一个临时的启动对象,并以一个空字符串作为键名保存结果,227// 然后传递每个键值对给reviver函数去处理可能存在的转换。228// 如果没有reviver函数,我们就简单地返回这个结果。229returntypeof reviver === "function" 230 ? (function walk(holder, key) { 231var k, 232 v, 233 value = holder[key]; 234// reeser: 数组也是object类型;也可以通过for in 遍历;235if (value && typeof value === "object") { 236for (k in value) { 237if (Object.hasOwnProperty.call(value, k)) { 238 v = walk(value, k); 239if (v !== undefined) { 240 value[k] = v; 241 } else { 242delete value[k]; 243 } 244 } 245 } 246 } 247return reviver.call(holder, key, value); 248 })({ "": result }, "") 249 : result; 250 }; 251})(); 252253254 console.log(JSON.stringify(jsonParser(‘[{"a" :1}]‘, (key, value)=>{ 255if (key == ‘a‘) 256 { 257 console.log(`found key a. value:${value}`); 258 } 259return value; 260 })));
语言精粹>JSON解析器源码阅读' ref='nofollow'>
原文:https://www.cnblogs.com/reeser/p/9029947.html
内容总结
以上是互联网集市为您收集整理的<JavaScript语言精粹>JSON解析器源码阅读全部内容,希望文章能够帮你解决<JavaScript语言精粹>JSON解析器源码阅读所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。