NodeJS 中如何判断字符串是否是 JSON 对象

目前个人能想到的方案有正则匹配, 或者使用 JSON.parse 解析一下.

由于正则思考起来感觉很复杂, 这里介绍使用 try-catch + JSON.parse 的方法:

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
function isJsonStr(str) {
if (typeof str == 'string') {
try {
JSON.parse(str);
return true;
} catch (e) {
return false;
}
}
return false;
}

function isJsonString(str) {
try {
if (typeof JSON.parse(str) == 'object') {
return true;
}
} catch (e) {}
return false;
}

function isJson(str) {
try {
const obj = JSON.parse(str);
if (obj && typeof obj == 'object') return true;
} catch (e) {}

return false;
}

[
null,
,
123,
'123',
'abc',
'{abc: 123}',
"{'abc': 123}",
'{}',
'{"abc": 123}',
'{"abc": true}'
].forEach(v => {
console.log('%s isJsonStr => %s', v, isJsonStr(v));
console.log('%s isJsonString => %s', v, isJsonString(v));
console.log('%s isJson => %s', v, isJson(v));
console.log();
});

上面的几种方法是依次进化而来, 目前最优版本为 isJson 方法:

1
2
3
4
5
6
7
8
function isJson(str) {
try {
const obj = JSON.parse(str);
if (obj && typeof obj == "object") return true;
} catch (e) {}

return false;
}

由此衍生出将任何字符串解析为 JSON 对象:

1
2
3
4
5
6
7
8
9
10
11
parseStringToJsonObject(str) {
if (typeof str !== 'string') return str;

let parsed;
try {
parsed = JSON.parse(str);
if (parsed && typeof parsed == "object") return parsed;
} catch (parsedFailed) {}

return str;
}
Donate - Support to make this site better.
捐助 - 支持我让我做得更好.