博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何实现一个JSON.parse
阅读量:6822 次
发布时间:2019-06-26

本文共 5182 字,大约阅读时间需要 17 分钟。

之前收藏的一个把
json字符串转对象的解析器,代码比较易懂,直接贴源码。对于刚接触这块的同学应该能起到入门的作用
var json = {}json.parse = function(text) {    var at = 0    var ch = ' '    var escapee = {        '"': '"',        '\\': '\\',        '/': '/',        b: '\b',        f: '\f',        n: '\n',        r: '\r',        t: '\t'    }    var error = function(m) {        console.log(m);        throw {            name: 'SyntaxError',            message: m,            at: at,            text: text        }    }    var next = function(c) {        if (c && c !== ch) {            error("Expected '" + c + "' instead of '" + ch + "'")        }        ch = text.charAt(at)        at = at + 1        return ch    }    var white = function() {        while (ch && ch <= ' ') {            next()        }    }    var number = function() {        var number        var string = ''        if (ch === '-') {            string = '-'            next('-')        }        while (ch >= '0' && ch <= '9') {            string += ch            next()        }        if (ch === '.') {            string += '.'            while (next() && ch >= '0' && ch <= 9) {                string += ch            }        }        if (ch === 'e' || ch === 'E') {            string += ch            next()            if (ch === '-' || ch === '+') {                string += ch                next()            }            while (ch >= '0' && ch <= '9') {                string += ch                next()            }        }        number = string - 0        if (!isFinite(number)) {            error('Bad number')        } else {            return number        }    }    var string = function() {        var hex        var i        var string = ''        var uffff        if (ch === '"') {            while (next()) {                if (ch === '"') {                    next()                    return string // 空字符串                }                if (ch === '\\') {                    next()                    if (ch === 'u') {                        uffff = 0                        for (var i = 0; i < 4; i += 1) {                            hex = parseInt(next(), 16)                            if (!isFinite(hex)) {                                break                            }                            uffff = uffff * 16 + hex                        }                        string += String.fromCharCode(uffff)                    } else if (typeof escapee[ch] === 'string') {                        string += escapee[ch]                    } else {                        break                    }                } else {                    string += ch                }            }        }        error('Bad string')    }    var word = function() {        switch (ch) {            case 't':                next('t');                next('r');                next('u');                next('e');                return true;            case 'f':                next('f');                next('a');                next('l');                next('s');                next('e');                return false;            case 'n':                next('n');                next('u');                next('l');                next('l');                return null;        }        error("Unexpected '" + ch + "'");    }    var value    var array = function() {        var array = []        if (ch === '[') {            next('[')            white()            if (ch === ']') {                next(']')                return array // 空数组            }            while (ch) {                array.push(value())                white()                if (ch === ']') {                    next(']')                    return array                }                next(',')                white()            }        }        error('Bad array')    }    var object = function() {        var key        var object = {}        if (ch === '{') {            next('{')            white()            if (ch === '}') {                next('}')                return object // 空对象            }            while (ch) {                key = string()                white()                next(':')                if (Object.hasOwnProperty.call(object, key)) {                    error('Duplicate key "' + key + '"');                }                object[key] = value()                white()                if (ch === '}') {                    next('}')                    return object                }                next(',')                white()            }        }        error('Bad object')    }    value = function() {        white()        switch (ch) {            case '{':                return object()            case '[':                return array()            case '"':                return string()            case '-':                return number()            default:                return ch >= '0' && ch <= '9' ? number() : word()        }    }    return value(text)}

实现思路

json的结构分析

json的结构包含几种元素:

object(name value pair object)

此处指狭义的对象,名值对形式。广义上任何元素都是对象。

array

由[]符号包裹,元素用英文逗号分隔。

字面类型

字面类型最为简单,不能再嵌套

number

boolean

true or false

null

下面放几张json.org的图,以直观的形式展示json格式。

clipboard.png

clipboard.png

clipboard.png

object 内部的value和array内部的元素都可以是任意组成类型,可以存在任意层次的嵌套。因此用递归方式解析比较简单。

转载地址:http://wklzl.baihongyu.com/

你可能感兴趣的文章
Codeforces 768D:Jon and Orbs
查看>>
xtrabackup如何备份mysql数据库
查看>>
VMware中centos7无法共享文件夹的问题
查看>>
【C#】listview应用
查看>>
源代码防泄密、图纸防泄密
查看>>
shell
查看>>
7.多态
查看>>
JVM垃圾收集
查看>>
HDU 6077 Time To Get Up【模拟题】【水题】
查看>>
js经典试题之数据类型
查看>>
联想LVCC桌面云解决方案介绍
查看>>
Swap Nodes in Pairs leetcode
查看>>
java流压缩图片
查看>>
小虾视频网站广告屏蔽器 V 5.0
查看>>
图片处理工具包 v3.0
查看>>
test
查看>>
学习日志---linux磁盘矩阵RAID
查看>>
要不要fast-cgi
查看>>
js 获取当前年月日时分秒星期
查看>>
windows日志 编号10 wmi 错误处理
查看>>