让我们回顾一下(2019年及以后的情况)。
论点:像true
,false
,null
这样的值是有效的JSON (?)
事实:这些原始值是可解析为JSON,但它们并不是格式良好的JSON结构。 JSON 规范指出,JSON基于两种结构构建:名称/值对集合(对象)或值列表(数组)。
论点:不应该使用异常处理来执行某些预期的操作。
(这是一个有25个以上赞的评论!)
事实:不!在这种情况下,使用try/catch肯定是合法的。否则,您将需要进行大量的字符串分析,例如标记化/正则表达式操作;这会导致性能非常糟糕。
hasJsonStructure()
如果你的目标是检查某些数据/文本是否具有适当的JSON交换格式,这将非常有用。
function hasJsonStructure(str) {
if (typeof str !== 'string') return false;
try {
const result = JSON.parse(str);
const type = Object.prototype.toString.call(result);
return type === '[object Object]'
|| type === '[object Array]';
} catch (err) {
return false;
}
}
用法:
hasJsonStructure('true')
hasJsonStructure('{"x":true}')
hasJsonStructure('[1, false, null]')
safeJsonParse()
如果您希望在将某些数据解析为 JavaScript 值时更加谨慎,这将非常有用。
function safeJsonParse(str) {
try {
return [null, JSON.parse(str)];
} catch (err) {
return [err];
}
}
用法:
const [err, result] = safeJsonParse('[Invalid JSON}');
if (err) {
console.log('Failed to parse JSON: ' + err.message);
} else {
console.log(result);
}