为什么一个数字有效json?

时间:2013-06-20 21:55:50

标签: jquery json parsing

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

{
    "firstName": "John"
}

为什么1正确解析?无论如何都要让它反而引发错误。

5 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分: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字符串中包含的数据并调用它。
  3. 因此,如果在您的情况下执行步骤2.,它将只返回1,即使它不是真正的JSON。

    <强>更新 我很好奇原生JSON.parse would handle it如何做同样的事情(返回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 );
    },
    

答案 2 :(得分:4)

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

  1. 物件
  2. 阵列
  3. 字符串
  4. 数字
  5. 查看有关json的所有详细信息http://json.org/

    $ .parseJSON(“1”)实际读取有效的javascript编号1,结果为1

答案 3 :(得分:2)

1不是有效的“JSON文本”,但无论如何大多数JSON解析器都接受它。并非所有人都这样做,就像你在jsonlint中找到的那样。

我发布了more complete explanation来自JSON RFC的信息以及Douglas Crockford对另一个问题的回应。

答案 4 :(得分: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)
}