作为字符串的数字上的JSON.parse不会抛出错误

时间:2016-10-10 12:08:33

标签: javascript json

我认为这是正确区分无效 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对象作为字符串 有效。编辑了有关此问题的问题。

2 个答案:

答案 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