题目
给定一个字符串 str
,返回 JSON 解析后的 parsedStr
。你可以假设 str
是一个有效的 JSON 字符串,因此它只包含字符串、数字、数组、对象、布尔值和 null。str
不会包含不可见字符和转义字符。JSON 中的字符串值只包含字母数字字符。
请在不使用内置的 JSON.parse
方法的情况下解决此问题。
示例 1:
输入:str = ‘{“a”:2,”b”:[1,2,3]}’
输出:{“a”:2,”b”:[1,2,3]}
解释:返回由 JSON 字符串表示的对象。
示例 2:
输入:str = ‘true’
输出:true
解释:原始类型是有效的 JSON。
示例 3:
输入:str = ‘[1,5,”false”,{“a”:2}]’
输出:[1,5,”false”,{“a”:2}]
解释:返回由 JSON 字符串表示的数组。
提示:
str 是一个有效的 JSON 字符串
1 <= str.length <= 105
分析题目
在JSON中,值可以是对象、数组、字符串、布尔值、null或数字。
也就是说,我们可以根据当前字符的类型判断应该调用哪个类型的解析函数来处理。
- 当
"
开始一直到下一个 "
前,这段期间的内容都是 字符串,
- 当
[
开始一直到下一个 ]
前,这段期间的内容都是 数组,
- 当
{
开始一直到下一个 }
前,这段期间的内容都是 对象
- 当开头直接就是
t
, f
, n
时,直接当做 true
, false
, null
处理。
- 当遇到其他类型时,我们全部当做数值处理即可。
我们可以维护一个全局 index
变量,这样我们可以直接获取到当前解析值的位置。
方法1:xxxx
思路
实际代码实现并不复杂,主要在于递归时 index 下标的位置不太好调试。
函数的核心实现方法是 parseValue
函数, 该函数可以用来解析JSON
字符串中的值。
当调用parseValue
时,会根据当前字符的类型调用相应的解析函数
具体实现
JavaScript 实现
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
| var jsonParse = function(str) { const n = str.length; let index = 0; function parseString() { let curStr = ""; while(++index < n && str.charAt(index) !== '"') { curStr += str.charAt(index); } index++; return curStr } function parseNumber(){ let num = ''; while(index < n) { cur = str.charAt(index); if(!/[\d.\-]/.test(cur)) break; num += cur; index++; } return parseFloat(num) } function parseArray(){ let arr = []; index++; while(index < n && str.charAt(index) !==']') { arr.push(parseValue()); if (str.charAt(index) === ',') { index++; } } index++; return arr; } function parseObject(){ let obj = {} index ++; while(index < n && str.charAt(index) !=='}') { const key = parseString(); index++; const value = parseValue(); obj[key] = value; if(str.charAt(index) === ',') { index++; } } index++; return obj; } function parseValue() { const first = str.charAt(index); if(first === '"') { return parseString(); }else if (first === '[') { return parseArray(); }else if (first === '{') { return parseObject(); }else if (first === 'f') { index += 5; return false; }else if (first === 't') { index += 4; return true; }else if (first === 'n') { index += 4; return null; }else { return parseNumber(); } }
return parseValue(); };
|