JS手动实现解析JSON 发表于 2021-01-01 | 分类于 技术分享 | | 阅读次数: 字数统计: 490 | 阅读时长 ≈ 3 测试1234567891011121314151617181920console.log(parseText(`{ "transformRequest": {}, "transformResponse": {}, "timeout": 10000, "xsrfCookieName": "XSRF-TOKEN", "xsrfHeaderName": ["X-XSRF-TOKEN","X-XSRF-TOKEN2","X-XSRF-TOKEN3"], "maxContentLength": -1, "headers": { "Accept": "application/json, text/plain, */*", "Content-Type": "application/json;charset=UTF-8" }, "baseURL": "/test", "method": "post", "url": "/test", "data": "{\\"page\\":1,\\"limit\\":10}"}`)); 实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154let tokenReg = { string: new RegExp("^(\"([^\"\\\\]|\\\\.)*\")"), number: new RegExp("^(-?\\d+(\\.\\d+)?)"), boolean: new RegExp("^(true|false)"), null: new RegExp("^(null)"), objectOpen: new RegExp("^(\\{)"), objectClose: new RegExp("^(\\})"), arrayOpen: new RegExp("^(\\[)"), arrayClose: new RegExp("^(\\])"), colon: new RegExp("^(\\:)"), split: new RegExp("^(\\,)"), space: new RegExp("^(\\s+)"),}function getFirstToken(text, type) { if (!tokenReg[type].test(text)) { return null; } return { type, match: text.match(tokenReg[type])[1] };}function transString(text) { let val = ""; for (let i = 1; i < text.length - 1; i++) { if (text[i] != "\\") { val += text[i]; } else { switch (text[i + 1]) { case "n": val += "\n"; break; case "t": val += "\t"; break; default: val += text[i + 1]; break; } i++; } } return val;}function parseTokens(tokens, index) { switch (tokens[index].type) { case "objectOpen": { index++; let obj = {}; while (tokens[index].type != "objectClose") { if (tokens[index].type == "string" && tokens[index + 1].type == "colon") { let item = parseTokens(tokens, index + 2); obj[transString(tokens[index].match)] = item.data; index = item.nextIndex; if (tokens[index].type == 'split') { index++; } } else { throw new Error(); } } return { nextIndex: index + 1, data: obj }; } case "arrayOpen": { index++; let obj = []; while (tokens[index].type != "arrayClose") { let item = parseTokens(tokens, index); obj.push(item.data); index = item.nextIndex; if (tokens[index].type == 'split') { index++; } } return { nextIndex: index + 1, data: obj }; } case "string": { return { nextIndex: index + 1, data: transString(tokens[index].match) }; } case "number": { return { nextIndex: index + 1, data: Number(tokens[index].match) }; } case "boolean": { return { nextIndex: index + 1, data: Boolean(tokens[index].match) }; } case "null": { return { nextIndex: index + 1, data: null }; } default: throw new Error(); }}function formatTokens(tokens) { let format = ""; let deepth = 0; const enter = (dp) => format += "\n" + " ".repeat(dp); for (let item of tokens) { if (item.type == 'objectClose' || item.type == 'arrayClose') { enter(--deepth); } format += item.match; if (item.type == 'objectOpen' || item.type == 'arrayOpen') { enter(++deepth); } if (item.type == 'split') { enter(deepth); } if (item.type == 'value') { format += " "; } } return format;}function parseText(text) { let tokens = []; while (text) { let item for (let k in tokenReg) { item = getFirstToken(text, k); if (item) { break; } } tokens.push(item); text = text.substring(item.match.length); } tokens = tokens.filter(o => o.type != "space"); console.log(formatTokens(tokens)); return parseTokens(tokens, 0).data;} 欢迎关注我的博客公众号 如果觉得我的文章对你有用,请随意赞赏 打赏 微信支付 支付宝