ES5提供一个内置的(全局)JSON对象,可用来序列化(JSON.stringfy)和反序列化(parse)对象为JSON格式绑定,下面是自己尝试实现的一个JSON parser函数。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
function parseJson(str) { var json = str var i = 0 return parse()
function parse() { if (!isNaN(json[i])) { return parseNumber() } if (json[i] === '"') { return parseString() } if (json[i] === 't') { return parseTrue() } if (json[i] === 'f') { return parseFalse() } if (json[i] === 'n') { return parseNull() } if (json[i] === '[') { return parseArray() } if (json[i] === '{') { return parseObject() } } function parseNumber() { var start = i while (true) { i++ if (isNaN(json[i])) { return Number(json.slice(start, i)) } } } function parseString() { var start = i + 1 var index = json.indexOf('"', start) var string = json.slice(start, index) i = index + 1 return string } function parseTrue() { i = i + 4 return true } function parseFalse() { i = i + 5 return false } function parseNull() { i = i + 4 return null } function parseArray() { var result = [] i++ while (true) { if (json[i] === ']') { i++ break } result.push(parse()) if (json[i] == ',') { i++ } } return result } function parseObject() { var result = {} i++ var key var value while (true) { key = parseString() i++ value = parse() result[key] = value if (json[i] == '}') { break } else { i++ continue } } return result } }
|
测试
1 2 3 4 5 6
| var json = '{"foo":true,"bar":2878,"str":"abcdef","a":null,"arr":[true,1,2],"obj":{"foo":"bar","ffo":"abc"}}'
parseJson(json)
|