Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON和对象文字符号有什么区别?_Javascript_Json_Object Notation - Fatal编程技术网

Javascript JSON和对象文字符号有什么区别?

Javascript JSON和对象文字符号有什么区别?,javascript,json,object-notation,Javascript,Json,Object Notation,有人能告诉我使用对象文字符号定义的JavaScript对象和JSON对象之间的主要区别吗 根据一本JavaScript书,它说这是一个使用对象符号定义的对象: 为什么在这种情况下它不是JSON对象?仅仅因为它不是用引号来定义的吗?让我们先澄清一下它实际上是什么。JSON是一种文本、独立于语言的数据交换格式,非常类似于XML、CSV或YAML 数据可以以多种方式存储,但如果数据应该存储在文本文件中,并且计算机可以读取,则需要遵循某种结构。JSON是定义这种结构的多种格式之一 这些格式通常是独立于语

有人能告诉我使用对象文字符号定义的JavaScript对象和JSON对象之间的主要区别吗


根据一本JavaScript书,它说这是一个使用对象符号定义的对象:


为什么在这种情况下它不是JSON对象?仅仅因为它不是用引号来定义的吗?

让我们先澄清一下它实际上是什么。JSON是一种文本、独立于语言的数据交换格式,非常类似于XML、CSV或YAML


数据可以以多种方式存储,但如果数据应该存储在文本文件中,并且计算机可以读取,则需要遵循某种结构。JSON是定义这种结构的多种格式之一


这些格式通常是独立于语言的,这意味着它们可以由Java、Python、JavaScript、PHP等处理


相反,JavaScript是一种编程语言。当然,JavaScript也提供了一种定义/描述数据的方法,但语法非常特定于JavaScript


作为反例,Python有元组的概念,它们的语法是
(x,y)
。JavaScript没有这样的东西



让我们看看JSON和JavaScript对象文本之间的语法差异


JSON具有以下语法约束:

  • 对象键必须是字符串(即用双引号括起来的字符序列
  • 这些值可以是:
    • 一串
    • 一个(JSON)对象
    • 阵列
    • true
    • false
    • null
  • 重复键(
    {“foo”:“bar”,“foo”:“baz”}
    )会产生未定义的、特定于实现的结果;JSON规范没有明确定义它们的语义

在JavaScript中,对象文本可以具有

  • 字符串文字、数字文字或标识符名称作为键(自ES6以来,现在还可以计算键,这引入了另一种语法)
  • 这些值可以是任何有效的JavaScript表达式,包括函数定义和未定义的
  • 重复的关键点会产生定义的、指定的结果(在松散模式下,后一个定义将替换前者;在严格模式下,这是一个错误)


要知道,只要看一下语法,您的示例就不是JSON,原因有两个:

  • 您的键不是字符串(文字)。它们是标识符名称
  • 不能将函数作为值分配给“JSON对象”(因为JSON没有为函数定义任何语法)

  • 但最重要的是,重复我从一开始的解释:您处于JavaScript上下文中。您定义了一个JavaScript对象。如果有的话,“JSON对象”只能包含在字符串中:

     var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
     var json = '{"foo": 452}'; // creates a string containing JSON
    

    也就是说,如果您正在编写JavaScript源代码,而不是处理字符串,那么您就不是在处理JSON。可能您是以JSON的形式接收数据的(例如,通过ajax或从文件读取),但一旦您或您使用的库对其进行了解析,它就不再是JSON了



    仅仅因为对象文字和JSON看起来相似,并不意味着可以互换命名它们。另请参见。

    的语法非常有限,包括:

    • 关键值必须被引用
    • 字符串必须用
      而不是
    • 您的值范围更为有限(例如,不允许使用函数)

    据我所知,主要区别在于灵活性


    JSON是一种“JavaScript对象表示法”的包装器,它强制用户遵守更严格的对象定义规则。它通过限制JavaScript对象标记特性提供的可能的对象声明方式来实现这一点


    因此,我们有一个更简单、更标准化的对象,它更适合于平台之间的数据交换


    因此,基本上,我上面示例中的newObject是使用JavaScript对象表示法定义的对象;但它不是一个“有效”的JSON对象,因为它不遵循JSON标准要求的规则


    此链接也非常有用:
    根据


    JSON是对象的一个属性 JavaScript的文字符号


    换句话说,有效的JSON也是有效的JavaScript对象文字符号,但不一定相反


    正如@Filix King所建议的,除了阅读这些内容外,我还建议大家玩一下。这就是我了解到JSON对象的键必须是字符串的原因。

    实际上没有“JSON对象”这样的东西


    JSON规范是将数据编码为字符串的语法。人们所谓的“JSON对象”(javascript)实际上只是一个普通的javascript对象,它(可能)已从有效的JSON字符串反序列化,并且可以轻松地重新序列化为有效的JSON字符串。这通常意味着它只包含数据(而不包含函数)。这还意味着没有日期,因为JSON没有日期类型(可能是JSON最痛苦的事情;)


    此外,(旁白…)当人们谈论“JSON对象”时,他们几乎总是指在顶层有“花括号”的数据。这相当于一个javascript对象。然而,JSON规范并不要求JSON字符串的顶层有一个“花括号”对象。在顶层有一个列表,甚至只有一个值,这是非常有效的JSON。因此,虽然每个“JSON对象”都对应于有效的JSON,但并非所有有效的JSON字符串都对应于我们所谓的“JSON对象”!(因为字符串可以表示一个列表或一个原子值)

    对于那些仍然认为RFC比博客和基于观点的误解更重要的人,让我们尝试回答澄清一些问题。 我不会重复所有正确的区别
     var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
     var json = '{"foo": 452}'; // creates a string containing JSON
    
          {
            "Image": {
                "Width":  800,
                "Height": 600,
                "Title":  "View from 15th Floor",
                "Thumbnail": {
                    "Url":    "http://www.example.com/image/481989943",
                    "Height": 125,
                    "Width":  100
                },
                "Animated" : false,
                "IDs": [116, 943, 234, 38793]
              }
          }
    
    const JS_Object = {
      1: 2,  // the key here is the number 1, the value is the number 2
      a: 'b', // the key is the string a, the value is the string b
      func: function () { console.log('hi') }
      // the key is func, the value is the function
    }