我认为这是正确区分无效 JSON对象为字符串 与有效
的方法之一
function isValidJson(s) {
try {
JSON.parse(s);
return true;
} catch (e) {
return false;
}
}
console.log(isValidJson(1234)); // true
console.log(isValidJson('1234')); // true
console.log(isValidJson('Is life a valid JSON?')); // false :(
console.log(isValidJson('{"a" : { "b": [1, 2, 3] }}')); // true
就实现这一区别而言,这是我看到的最常见的答案。我似乎不太明白这里发生了什么。此片段实际上将数字和数字识别为字符串作为有效的JSON对象。任何人都可以说明为什么/如何发生这种情况?
另外,在阅读MDN docs for JSON.parse时,我找到了reviver方法。我写了一个似乎适用于所有场景的函数。这个功能实际上是正确的吗?
function isValidJson(s) {
try {
JSON.parse(s, function(k, v) {
if (k === "" && typeof v === "number") {
throw "Invalid JSON";
}
return v;
});
return true;
} catch (e) {
return false;
}
}
console.log(isValidJson(1234)); // false
console.log(isValidJson('1234')); // false
console.log(isValidJson('Is life a valid JSON?')); // false :(
console.log(isValidJson('{"a" : { "b": [1, 2, 3] }}')); // true
[编辑]我可能错误地暗示我正在寻找有效的JSON字符串。我的意思是,将 JSON对象作为字符串 有效。编辑了有关此问题的问题。
答案 0 :(得分:2)
JSON文本可以是任何JSON数据类型。
1234
...是一个由数字组成的有效JSON文本。 (将1234
作为数字传递给JSON.parse
,因为它通过JavaScript的常规类型转换规则转换为字符串。)
"Is life a valid JSON?"
...是一个由String组成的有效JSON文本。
Is life a valid JSON?
...不是有效的JSON文本。它只是一堆与任何JSON数据类型的语法都不匹配的字符。
所以没有。你的第二个功能不对。它声称1234
无效JSON。
答案 1 :(得分:1)
我认为isValidJsonString(1234)
返回true
的情况只是Javascript在第一次机会时将事情转化为字符串的通常渴望。如果你在函数中添加一个参数实际上是字符串的检查,那么一切都很好:
function isValidJsonString(s) {
if (typeof s !== 'string') {
return false;
}
try {
JSON.parse(s);
return true;
} catch (e) {
return false;
}
}
其他人已经按照自己的意愿工作了。
此代码段实际上将数字和数字识别为字符串作为有效的JSON字符串。任何人都可以说明为什么/如何发生这种情况?
这是因为数字作为字符串是有效的JSON字符串。
[编辑]我可能错误地暗示我正在寻找有效的JSON字符串。我的意思是,有效的JSON对象是字符串。编辑了有关此问题的问题。
您当前的方法也不会这样做,它只会排除数字。
JSON值可以是七种不同的东西:object(在{}
中),array(在[]
中),string(在""
中),number,null
,{ {1}}或false
。其中,您只排除数字。
如果您使用true
,则只接受对象,数组和typeof v !== "object"
。也许这就是你想要的,也许不是。
如果您只想要JSON对象,只需检查JSON字符串中的第一个非空白字符是null
。