为什么一个数字有效json?

Ale*_*xis 19 jquery parsing json

$.parseJSON("1")回报1.我希望这会抛出一个错误,因为这似乎不是形式的有效JSON:

{
    "firstName": "John"
}
Run Code Online (Sandbox Code Playgroud)

为什么1解析正确?反正有没有让它反而引发错误.

Jac*_*cob 13

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


Bar*_*art 13

解析一个数字

您可以使用更好地处理数字解析parseInt().它会在成功时返回一个数字,否则返回NaN(非数字).

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

var b = parseInt('ab');
isNan(b); // true
Run Code Online (Sandbox Code Playgroud)

为什么它在jQuery中返回1

如果你看一下jQuery方法的来源,它会很快变得清晰.

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

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

更新: 我很好奇原生如何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 );
},
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

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

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

  • 如果你去 http://www.jslint.com/ 广告在 http://json.org 的底部并输入 `1` 它将失败。对我来说这很有意义,因为它是 JavaScript **Object** Notation 并且 number 不是一个对象。对象和数组都是。 (2认同)
  • 如果你读一点,但更进一步,你会看到'2。JSON Grammar` 包含以下内容:`JSON 文本是序列化的对象或数组。JSON 文本 = 对象/数组`。所以我认为介绍有点误导。 (2认同)