一个JSON解析器

来源

《JavaScript语言精粹(修订版)》

代码

  1 <!DOCTYPE html>
  2 <html>
  3
  4 <head>
  5     <meta charset="UTF-8">
  6     <title></title>
  7 </head>
  8
  9 <body>
 10     <script>
 11         var json_parse = function () {
 12             var
 13                 at,
 14                 ch,
 15                 escapee = {
 16                     ‘"‘: ‘"‘,
 17                     ‘\\‘: ‘\\‘,
 18                     ‘/‘: ‘/‘,
 19                     b: ‘b‘,
 20                     f: ‘\f‘,
 21                     n: ‘\n‘,
 22                     r: ‘\r‘,
 23                     t: ‘\t‘
 24                 },
 25                 text,
 26                 // 抛出异常
 27                 error = function (m) {
 28                     throw {
 29                         name: ‘SyntaxError‘,
 30                         message: m,
 31                         at: at,
 32                         text: text
 33                     }
 34                 },
 35                 // 获取下一个字符
 36                 next = function (c) {
 37                     if (c && c !== ch) {
 38                         error(`Expected ${c} instead of ${ch}`);
 39                     }
 40                     ch = text.charAt(at);
 41                     at += 1;
 42                     return ch;
 43                 },
 44                 // 解析一个数字值
 45                 number = function () {
 46                     var number, string = ‘‘;
 47                     // 负号
 48                     if (ch === ‘-‘) {
 49                         string = ‘-‘,
 50                             next(‘-‘)
 51                     }
 52                     // 整数
 53                     while (ch >= ‘0‘ && ch <= ‘9‘) {
 54                         string += ch;
 55                         next();
 56                     }
 57                     // 小数
 58                     if (ch === ‘.‘) {
 59                         string += ‘.‘;
 60                         while (next() && ch >= ‘0‘ && ch <= ‘9‘) {
 61                             string += ch;
 62                         }
 63                     }
 64                     // 指数
 65                     if (ch === ‘e‘ || ch === ‘E‘) {
 66                         string += ch;
 67                         next();
 68                         if (ch === ‘-‘ || ch === ‘+‘) {
 69                             string += ch;
 70                             next();
 71                         }
 72                         while (ch >= ‘0‘ && ch <= ‘9‘) {
 73                             string += ch;
 74                             next();
 75                         }
 76                     }
 77                     number = +string;
 78                     if (isNaN(number)) {
 79                         error(‘Bad number‘)
 80                     } else {
 81                         return number;
 82                     }
 83                 },
 84                 // 解析一个字符串值
 85                 string = function () {
 86                     var hex,
 87                         i,
 88                         string = ‘‘,
 89                         uffff;
 90                     // 字符串必须以双引号开始
 91                     if (ch === ‘"‘) {
 92                         while (next()) {
 93                             if (ch === ‘"‘) {
 94                                 next();
 95                                 return string;
 96                             } else if (ch === ‘\\‘) {
 97                                 next();
 98                                 // unicode码
 99                                 if (ch === ‘u‘) {
100                                     uffff = 0;
101                                     for (i = 0; i < 4; i++) {
102                                         hex = parseInt(next(), 16);
103                                         if (!isFinite(hex)) {
104                                             break;
105                                         }
106                                         ufff = ufff * 16 + hex;
107                                     }
108                                     string += String.fromCharCode(ufff)
109                                 }
110                                 else if (typeof escapee[ch] === ‘string‘) { // 转义字符
111                                     string += escapee[ch]
112                                 } else {
113                                     break;
114                                 }
115                             } else {
116                                 string += ch;
117                             }
118                         }
119                     }
120                     error(‘Bac string‘);
121                 },
122                 // 跳过空白
123                 white = function () {
124                     while (ch && ch <= ‘ ‘) {
125                         next();
126                     }
127                 },
128                 // 解析 true、false、null
129                 word = function () {
130                     switch (ch) {
131                         case ‘t‘:
132                             next(‘t‘);
133                             next(‘r‘);
134                             next(‘u‘);
135                             next(‘e‘);
136                             return true;
137                         case ‘f‘:
138                             next(‘f‘);
139                             next(‘a‘);
140                             next(‘l‘);
141                             next(‘s‘);
142                             next(‘e‘);
143                             return true;
144                         case ‘n‘:
145                             next(‘n‘);
146                             next(‘u‘);
147                             next(‘l‘);
148                             next(‘l‘);
149                             return true;
150                     }
151                     error(`Unexpected ${ch}`)
152                 },
153                 // 解析一个数组值
154                 array = function () {
155                     var array = [];
156                     if (ch === ‘[‘) {
157                         next(‘[‘);
158                         white();
159                         if (ch === ‘]‘) {
160                             next(‘]‘);
161                             return array;
162                         }
163                         while (ch) {
164                             array.push(value());
165                             white();
166                             if (ch === ‘]‘) {
167                                 next(‘]‘);
168                                 return array;
169                             }
170                             next(‘,‘);
171                             white();
172                         }
173                     }
174                     error(‘Bad array‘);
175                 },
176                 // 解析一个对象值
177                 object = function () {
178                     var key, object = {};
179                     if (ch === ‘{‘) {
180                         next(‘{‘);
181                         white();
182                         if (ch === ‘}‘) {
183                             next(‘}‘);
184                             return object;
185                         }
186                         while (ch) {
187                             key = string();
188                             white();
189                             next(‘:‘);
190                             object[key] = value();
191                             white();
192                             if (ch === ‘}‘) {
193                                 next(‘}‘);
194                                 return object;
195                             }
196                             next(‘,‘);
197                             white();
198                         }
199                     }
200                     error(‘Bad object‘);
201                 },
202                 // 解析一个JSON值。它可以是对象、数组、字符串、数字、一个词。
203                 value = function () {
204                     white();
205                     switch (ch) {
206                         case ‘{‘:
207                             return object();
208                         case ‘[‘:
209                             return array();
210                         case ‘"‘:
211                             return string();
212                         case ‘-‘:
213                             return number;
214                         default:
215                             return ch >= ‘0‘ && ch <= ‘9‘ ? number() : word();
216                     }
217                 };
218             // 返回json_parse函数
219             return function (source, reviver) {
220                 var result;
221                 text = source;
222                 at = 0;
223                 ch = ‘ ‘;
224                 result = value();
225                 white();
226                 if (ch) { // 多余的非空白字符
227                     error(‘Syntax error‘);
228                 }
229                 return typeof reviver === ‘function‘ ? function walk(holder, key) {
230                     var k, v, value = holder[key];
231                     if (value && typeof value === ‘object‘) {
232                         // 递归处理对象的属性
233                         for (k in value) {
234                             if (Object.hasOwnProperty.call(value, k)) {
235                                 v = walk(value, k);
236                                 if (v !== undefined) {
237                                     value[k] = v;
238                                 } else {
239                                     delete value[k]
240                                 }
241                             }
242                         }
243                     }
244                     // 处理对象
245                     return reviver.call(holder, key, value);
246                 }({ ‘‘: result }, ‘‘) : result;
247             }
248         }();
249         // \n是一个字符,\\n是两个字符
250         const str = ‘{"name":"饮料","price":2.5,"cool":true,"description":["雪碧","可乐"],"escapseSlash":"\\/","escapeN":"\\n"}‘;
251         console.log(json_parse(str, (key, val) => val))
252     </script>
253 </body>
254
255 </html>

运行结果

原文地址:https://www.cnblogs.com/sea-breeze/p/11747206.html

时间: 2024-10-10 04:16:15

一个JSON解析器的相关文章

如何编写一个JSON解析器

编写一个JSON解析器实际上就是一个函数,它的输入是一个表示JSON的字符串,输出是结构化的对应到语言本身的数据结构. 和XML相比,JSON本身结构非常简单,并且仅有几种数据类型,以Java为例,对应的数据结构是: "string":Java的String: number:Java的Long或Double: true/false:Java的Boolean: null:Java的null: [array]:Java的List<Object>或Object[]: {"

一起写一个JSON解析器

[本篇博文会介绍JSON解析的原理与实现,并一步一步写出来一个简单但实用的JSON解析器,项目地址:SimpleJSON.希望通过这篇博文,能让我们以后与JSON打交道时更加得心应手.由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指正:)] 一.JSON解析器介绍 相信大家在平时的开发中没少与JSON打交道,那么我们平常使用的一些JSON解析库都为我们做了哪些工作呢?这里我们以知乎日报API返回的JSON数据来介绍一下两个主流JSON解析库的用法.我们对地址 http://

自己动手实现一个简单的JSON解析器

1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 web 应用开发领域内,得益于 JavaScript 对 JSON 提供的良好支持,JSON 要比 XML 更受开发人员青睐.所以作为开发人员,如果有兴趣的话,还是应该深入了解一下 JSON 相关的知识.本着探究 JSON 原理的目的,我将会在这篇文章中详细向大家介绍一个简单的JSON解析器的解析流

JSON解析器--实现代码

JSON解析器-实现方案 javascript对象表示法(javascript Object Notation,简称JSON)是一个轻量级的数据交换格式,他是基于js的对象字面量表示法. 经过长期的学习和使用,参考相关书籍,编写了一个JSON解析器: 即将它封装成了一个插件  文件名:json_parse.js,如下: var json_parse =function () { //这是一个能json文本解析成js数据结构的函数 //递归降序的解析器 //我们在零一个函数中定义此函数,以避免创建

面试题|手写JSON解析器

这周的 Cassidoo 的每周简讯有这么一个面试题:: 写一个函数,这个函数接收一个正确的 JSON 字符串并将其转化为一个对象(或字典,映射等,这取决于你选择的语言).示例输入: fakeParseJSON('{ "data": { "fish": "cake", "array": [1,2,3], "children": [ { "something": "else&qu

大家都懂的 JSON 解析器原理(一)简介 & 低配版入门

没学过编译原理,做一个 JSON 解析器难吗?--难!是不是就不能"迎难而上"呢?--不是!越是难的越是一个挑战!--笔者这里尝试通过通俗易懂的行文为大家介绍一下 JSON 解析器,--那一串串长长的 JSON 文本到底是如何被解析成为 Java 里面"可以理解的"对象的.前面的铺垫可能比较长,但请尽量不要跳过,因为那都是基础,尤其对于我们非科班来说,应要恶补.当然,为照顾大家的理解程度(包括我自己,我也会以后回看自己的代码,以此反复理解.反复消化),我会把代码写多

高性能JSON解析器及生成器RapidJSON

RapidJSON是腾讯公司开源的一个C++的高性能的JSON解析器及生成器,同时支持SAX/DOM风格的API. 直击现场 RapidJSON是腾讯公司开源的一个C++的高性能的JSON解析器及生成器,同时支持SAX/DOM风格的API. 项目源码地址: Github托管:https://github.com/TencentOpen/rapidjson CODE托管:https://code.csdn.net/Tencent/rapidjson RapidJSON的灵感来自RapidXml,它

这个东西,写C++插件的可以用到。 RapidJSON —— C++ 快速 JSON 解析器和生成器

原文: RapidJSON —— C++ 快速 JSON 解析器和生成器 时间 2015-04-05 07:33:33  开源中国新闻原文  http://www.oschina.net/p/rapidjson 4月18日 武汉 源创会开始报名,送华为开发板 Rapidjson 是一个 C++ 的快速 JSON 解析器和生成器,使用 SAX/DOM 风格的 API 设计. 示例代码: // rapidjson/example/simpledom/simpledom.cpp` #include "

&lt;JavaScript语言精粹&gt;JSON解析器源码阅读

1 // 这是一个用JavaScript编写JSON解析器的实现方案: 2 var jsonParser = (function() { 3 // 这是一个能把JSON文本解析成JavaScript数据结构的函数. 4 // 它是一个简单的递归降序解析器. 5 // 我们在另一个函数中定义此函数,以避免创建全局变量. 6 7 var at, // 当前字符索引 8 ch, // 当前字符 9 escapee = { 10 '"': '"', 11 "\\": &qu