JSON.将数字作为字符串进行解析不会抛出错误

JSON.parse on a number as a string doesn't throw error

本文关键字:错误 出错 数字 字符串 JSON      更新时间:2023-09-26

我认为这是正确区分无效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对象。有人能解释一下为什么/如何发生这种情况吗?

另外,在读取JSON的MDN文档。解析,我找到了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

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

JSON文本可以是任何JSON数据类型。

1234

…是一个由数字组成的有效JSON文本。(将1234作为数字传递给JSON.parse工作,因为它通过JavaScript的正常类型转换规则转换为字符串)。

"Is life a valid JSON?"

…是一个由字符串组成的有效JSON文本。

Is life a valid JSON?

…不是一个有效的JSON文本。它只是一堆字符,与任何JSON数据类型的语法都不匹配。

所以没有。你的第二个函数是不对的。它声称1234不是有效的JSON

我认为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字符串。

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

你当前的方法也不这样做,它只排除数字。

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

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

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

相关文章: