JSON和Object Literal Notation之间的区别是什么?

有人能告诉我通过使用“Object Literal Notation”定义的JavaScript对象和JSON对象之间的主要区别是什么?

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

var anObject = {
    property1 : true,
    showMessage : function (msg) { alert(msg) }
};

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


让我们首先澄清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表达式,包括函数定义和undefined
  • 重复键生成定义的指定结果(松散模式下,后者定义替换前者;在严格模式下,这是错误)。

  • 知道这一点,只是看语法,你的例子不是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对象”这样的事情。


    JSON的语法更为有限,其中包括:

  • 关键值必须被引用
  • 字符串必须用"而不是'引用
  • 你有一个更有限的值范围(例如,没有允许的功能)

  • 真的没有“JSON对象”这样的东西。

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

    此外,当人们谈论一个“JSON对象”时,他们几乎总是指在顶层具有“花括号”的数据。 这很好地对应于一个JavaScript对象。 但是,JSON规范并不要求在JSON字符串的顶层有一个“花括号”对象。 在顶层有一个列表,甚至只有一个值,这是完全有效的JSON。 所以,虽然每个“JSON对象”对应于有效的JSON,但并非所有有效的JSON字符串都对应于我们称之为“JSON对象”的东西! (因为该字符串可能代表一个列表或一个原子值)

    链接地址: http://www.djcxy.com/p/3391.html

    上一篇: What is the difference between JSON and Object Literal Notation?

    下一篇: How do I add comments to package.json for npm install?