23

$.parseJSON("1")返回1。我希望这会引发错误,因为这看起来不像是有效的 JSON 格式:

{
    "firstName": "John"
}

为什么1解析正确?反正有没有让这个抛出一个错误。

4

5 回答 5

14

虽然1不是有效的 JSON 对象,但它是有效的 JSON 编号。似乎$.parseJSON解析了所有 JSON 值,而不仅仅是对象。

于 2013-06-20T22:05:09.117 回答
13

解析一个数字

您可以使用 更好地处理数字解析parseInt()。成功时它将返回一个数字,否则返回NaN(不是数字)。

var a = parseInt('23');
isNan(a); // false

var b = parseInt('ab');
isNan(b); // true

为什么它在 jQuery 中返回 1

如果您查看 jQuery 方法的源代码,它会很快变得清晰。

  1. 它将检查是否有对 JSON.parse 的本机支持。
  2. 如果没有,它将创建一个匿名函数(带有字符串主体),该函数仅返回 JSON 字符串中包含的数据并调用它。

因此,如果在您的情况下执行步骤,即使它不是真正的 JSON,2.它也会简单地返回。1

更新: 我很好奇本地人如何JSON.parse 处理它并且它做同样的事情(返回1)。因此,无论实施如何,您总是会得到相同的结果。

展出的图书馆: http: //code.jquery.com/jquery-1.8.3.js

parseJSON: function( data ) {
    if ( !data || typeof data !== "string") {
        return null;
    }

    // Make sure leading/trailing whitespace is removed (IE can't handle it)
    data = jQuery.trim( data );

    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

    // Make sure the incoming data is actual JSON
    // Logic borrowed from http://json.org/json2.js
    if ( rvalidchars.test( data.replace( rvalidescape, "@" )
        .replace( rvalidtokens, "]" )
        .replace( rvalidbraces, "")) ) {

        return ( new Function( "return " + data ) )(); // Just returns JSON data.

    }
    jQuery.error( "Invalid JSON: " + data );
},
于 2013-06-20T22:07:00.270 回答
5

parseJSON 实际上只是从格式良好的 json 字符串返回 javascript 对象。json 格式不仅接受(关联)数组。它接受以下数据结构:

  1. 对象
  2. 数组
  3. 价值观
  4. 字符串
  5. 数字

有关 json 的所有详细信息,请查看http://json.org/

$.parseJSON("1") 实际上读取了一个有效的javascript数字1,结果为1

于 2013-06-20T22:18:38.020 回答
2

1不是有效的“JSON 文本”,但大多数 JSON 解析器都接受它。正如您在 jsonlint 中发现的那样,并非所有人都这样做。

我发布了一个更完整的解释,其中包含来自 JSON RFC 的信息以及 Douglas Crockford 的意见,以回应另一个问题。

于 2013-06-20T23:16:24.593 回答
0

这就是我解析 JSON 无效数字的方式

try {
     // JSON.parse accepts numbers but we do not want to do that
     if (!isNaN(parseInt(inputState))) {
          throw "Invalid JSON.";
     }
          // there we have valid JSON without number
          let validJSON = JSON.parse(inputState);
} catch (error) {
   console.log(error)
}
于 2020-10-23T06:11:09.907 回答