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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
| /** * Created by Andrew on 2017/7/30 0030. */ const log = console.log.bind(console) //处理key,value,去掉"" const parsedElement = (e) => { if (e[0] === '\"' || e[0] === "\'") { return e.slice(1, e.length - 1) } else { return Number(e) } } //解析name: 'gua', 一个字符值的情况 const parsedOne = (s) => { log('debug parsedOne', s) const obj = {} const arr = s.split(',') arr.forEach(e => { const t = e.split(":") const k = parsedElement(t[0]) const v = parsedElement(t[1]) obj[k] = v }) return obj } /** * [[[[[]]]]]]] * 处理{{{{}}}},取到最后一个},默认i处理object ,数组需要传false */ const findElementEnd = (str, start, isObj = true) => { let a = '' let b = '' if (isObj) { a = '{' b = '}' } else { a = '[' b = ']' } const stack = [a] let i = start + 1 while (i < str.length && stack.length > 0) { if (str[i] === a) { stack.push(a) } else if (str[i] === b) { let index = stack.length - 1 stack.splice(index, 1) } else { // } i++ } return i }
const dealWithArray = (s, arr = []) => { //50,"20",[1,[3,4],2],[55,66] const index = s.indexOf('[') log('debug diguiguigi----: ', s) if (index === -1) { const a = s.split(',').map(e => parsedElement(e)) arr.push.apply(arr, a) } else { //处理前面半段,不能为0 if (index !== 0) { let newStr = s.slice(0, index - 1) let a = newStr.split(',').map(e => parsedElement(e)) arr.push.apply(arr, a) } //递归(中间) const last = findElementEnd(s, index, false) let newS = s.slice(index + 1, last - 1) let temp = [] let b = dealWithArray(newS, []) arr.push(b) //处理后面半段 log('===============================\n') //继续递归 let newStr = s.slice(last + 1) if (newStr.length > 0) { log('test------', newStr) let c = dealWithArray(newStr, []) arr.push.apply(arr, c) } } return arr }
const myParse = (s, obj = {}) => { if (s[0] === '{') { s = s.slice(1, s.length - 1) } //复杂情形 // "name":"gua","todo":{"play":"0/1"} let index = s.indexOf(':') const str = s[index + 1] log('debug digui ', s, '\n') if (str === '{') { log('-----enter object parse-----------') let key = s.split(':{')[0] //截取s key = parsedElement(key) // 找到最后一个} const last = findElementEnd(s, index) const newStr = s.slice(index + 2, last - 1) let o = {} o = myParse(newStr, o) obj[`${key}`] = o log('debug newStr : ', newStr) log('debug o : ', o) } else if (str !== '{' && str !== '[') { log(`----enter str parse--------${s} \n`) //取到"name":"gua" const cell = s.split(',')[0] log('cell ', s, '----', cell) const o = parsedOne(cell) const k = Object.keys(o)[0] obj[`${k}`] = o[k] //log('obj: ',obj) //下一个元素 index = s.indexOf(',') if (index !== -1) { s = s.slice(index + 1) obj = myParse(s, obj) } } else if (str === '[') { log('-----enter array parse-----------') //"age":[50,20,30] let key = s.split(':[')[0] //截取s key = parsedElement(key) // 找到最后一个] const last = findElementEnd(s, index, false) const newStr = s.slice(index + 2, last - 1) // const r = dealWithArray(newStr) log('final:', r) //log('debug arr: ',newStr) //Todo 有bug需要考虑后续字符s.slice(last + 1) obj[`${key}`] = r } return obj }
const testParser = () => { const o = { todo: { 'play': '0/1', 'sports': { 'gua':{ 'test':222 } } }, //name: 'test', //todo: 没完成:array单独运行没问题,和obj搭配有bug,需要update //age: [50,'20',[1,[3,4],[22,33],2] ,[55,66]], } const s = JSON.stringify(o) const obj = myParse(s) log('\n\nfinal result : ') log('\nJSON.parse result:', s) log(`\nAndrew's JSON Parse : `, obj) log(`\nAndrew's JSON Parse TODO 子类obj : `, obj['todo']) }
testParser()
|