将 JSON 字符串转换为对象

题目


给定一个字符串 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或数字。
也就是说,我们可以根据当前字符的类型判断应该调用哪个类型的解析函数来处理。

  • 当 " 开始一直到下一个 " 前,这段期间的内容都是 字符串,
  • 当 [ 开始一直到下一个 ] 前,这段期间的内容都是 数组,
  • 当 { 开始一直到下一个 } 前,这段期间的内容都是 对象
  • 当开头直接就是 tfn 时,直接当做 truefalsenull 处理。
  • 当遇到其他类型时,我们全部当做数值处理即可。

我们可以维护一个全局 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 = "";
// ++index 是为了直接跳过首个 `"` 字符
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();
};

将 JSON 字符串转换为对象
https://blog.pangcy.cn/2023/07/04/编程素养相关/数据结构与算法/LeetCode/将 JSON 字符串转换为对象/
作者
子洋
发布于
2023年7月4日
许可协议