【问题标题】:Why is one number valid json?为什么一个数字是有效的json?
【发布时间】:2013-06-17 22:52:21
【问题描述】:

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

{
    "firstName": "John"
}

为什么1 解析正确?有没有办法让它抛出一个错误。

【问题讨论】:

  • Number 是一种原始数据类型。如果值是原始数据类型,JSON 有效
  • @Sushanth——不是根据 jslint.com。这是一个有趣的问题
  • 我猜它是有效的,因为它也适用于JSON.parse("1")
  • json.org 上的任何铁路图都是有效的 JSON,应该可以通过 parseJSON 的良好实现来解析。
  • @FishBasketGordo 这不是真的。 JSON 解析器只需要解析 JSON 文本。 JSON 文本是一个序列化的对象或数组。 JSON 值本身不会生成 JSON 文本。有关更多信息,请参阅 RFC:ietf.org/rfc/rfc4627.txt

标签: jquery json parsing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    解析数字

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

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

    为什么它在 jQuery 中返回 1

    如果你看一下 jQuery 方法的来源,很快就会明白。

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

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

    更新: 我很好奇原生的JSON.parsewould 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 );
    },
    

    【讨论】:

      【解决方案3】:

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

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

      查看http://json.org/ 了解有关 json 的所有详细信息。

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

      【讨论】:

      • 如果您转到json.org 底部的广告jslint.com 并输入1,它将失败。对我来说这很有意义,因为它是 JavaScript Object 符号,而数字不是对象。对象和数组是。
      • 奇怪,因为 JSON RFC (ietf.org/rfc/rfc4627.txt) 在介绍(第 1 部分)中指出 JSON 可以表示四种基本类型(字符串、数字、布尔值和 null)和两种结构化类型(对象和数组)。
      • 如果你读了一点,但进一步你会看到2. JSON Grammar,下面是:A JSON text is a serialized object or array. JSON-text = object / array。所以我认为介绍有点误导。
      • 是的,Bart,您说的完全正确,我已经阅读了整篇文章,但只是想指出 RFC 可以通过多种方式进行解释。我什至会说整数也是一个对象,但这超出了这个问题的范围
      • @blowdoof JSON 中没有整数,只有数字。而且 JSON 数字不是对象,它们是值。
      【解决方案4】:

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

      我发布了一个more complete explanation,其中包含来自 JSON RFC 的信息以及 Douglas Crockford 对另一个问题的意见。

      【讨论】:

        【解决方案5】:

        这就是我解析 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)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-10
          • 2012-05-10
          • 2011-06-15
          • 2013-02-03
          • 1970-01-01
          • 2011-04-08
          • 1970-01-01
          相关资源
          最近更新 更多