2016-10-10 55 views
-1

我认为,这是从一个有效的JSON.parse上一个数字作为一个字符串不会引发错误

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对象作为字符串的途径之一

这是我看到的最常见的答案,关于实现区别。我似乎不太明白这里发生了什么。这段代码实际上将数字和数字识别为字符串作为有效的JSON对象。任何人都可以点亮为什么/如何发生这种情况?

此外,在阅读MDN docs for JSON.parse,我发现齐磊方法。我写了一个似乎适用于所有场景的函数。这个函数实际上是否正确?

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

你认为数组是对象吗? Javascript不会,但JSON不会。那么null呢? – RemcoGerlich

+0

是的。我需要'[]'以及'{}'才能被视为有效。 null不应该被认为是有效的,我想我的解决方案不认为是空的。我可以改变这一点。我更倾向于理解JSON.parse在传入数字或数字字符串时不会抛出异常。 –

+0

你的第一个函数不会抛出异常,因为数字字符串很好JSON,你的第二个函数事实上会在你的if中抛出“无效的JSON”异常,因为那个返回'1234'的假。所以我不明白你的意见。 – RemcoGerlich

回答

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

我认为isValidJsonString(1234)返回true的情况正好是它的惯用手段,即在第一次把事情转化为字符串的时候,它就是它的惯用手段。如果添加的支票的说法实际上是一个字符串函数,一切都很好:

function isValidJsonString(s) { 
    if (typeof s !== 'string') { 
    return false; 
    } 
    try { 
    JSON.parse(s); 
    return true; 
    } catch (e) { 
    return false; 
    } 
} 

其他人已经因为他们应该工作。

这段代码实际上将数字和数字识别为字符串作为有效的JSON字符串。任何人都可以点亮为什么/如何发生这种情况?

它发生,因为数字作为字符串是有效的JSON字符串。

[编辑]我可能错误地暗示我正在寻找区分有效的JSON字符串。我的意思是,有效的JSON对象作为字符串。就此编辑这个问题。

您目前的方法也不会这样做,它只会排除数字。

JSON值可以是七种不同的东西:对象(在{}),阵列(在[]),字符串(在""),数,nullfalsetrue。其中,您只排除数字。

如果使用typeof v !== "object",那么只接受对象,数组和null。也许这就是你想要的,也许不是。

如果您只想要JSON对象,请检查JSON字符串中的第一个非空白字符是否为{

相关问题