JSON和Object Literal Notation有什么区别?

时间:2010-05-25 11:34:31

标签: javascript json object-notation

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

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

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

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

9 个答案:

答案 0 :(得分:235)

让我们首先澄清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,原因有两个:

  1. 您的密钥不是字符串(文字)。它们是标识符名称
  2. 您不能将函数作为值分配给“JSON对象”(因为JSON没有为函数定义任何语法)。
  3. 但最重要的是,从头开始重复我的解释:您处于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看起来类似,这并不意味着您可以互换地命名它们。另请参阅There's no such thing as a "JSON Object"

答案 1 :(得分:39)

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

  • 必须引用键值
  • 字符串必须引用"而不是'
  • 您的值范围更为有限(例如,不允许使用任何功能)

答案 2 :(得分:13)

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

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

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

答案 3 :(得分:9)

根据JSON in JavaScript

  

JSON是对象的subset   JavaScript的字面符号。

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

除了阅读documentation之外,正如@Filix King建议的那样,我还建议玩JSONLint online JSON validator。这就是我了解到JSON对象的键必须是字符串的方式。

答案 4 :(得分:2)

对于仍然认为RFC比博客和基于意见的误解更重要的人,让我们尝试回答澄清一些观点。 我不打算重复前面回答中已经提到的所有正确差异,这里我只是尝试添加一些关键部分rfc7159

https://tools.ietf.org/html/rfc7159提取

  1. JavaScript 对象表示法(JSON)是一种文本格式 结构化数据的序列化。它源自对象 JavaScript文字,在ECMAScript编程中定义 语言标准,第三版[ECMA-262]。
  2. JSON可以表示四种基本类型(字符串,数字,布尔值, 和null)和两个结构化类型(对象和数组)。
  3. 对象是零个或多个名称/值的无序集合 对,其中名称是字符串,值是字符串,数字, boolean,null, object 或array。
  4. 开始对象 = ws%x7B ws; {左大括号
  5. 结束对象 = ws%x7D ws; }右大括号
  6. JSON值必须是对象,数组,数字或字符串,或者其中之一 以下三个文字名称:false null tr​​ue
  7. 对象结构表示为一对花括号
  8. 对象中的名称应该是唯一的。   对象 = 开始对象 [成员*(值分隔符成员)]            的最终对象
  9. 其名称都是唯一的对象在某种意义上是可互操作的 接收对象的所有软件实现都会同意 名称 - 值映射。当对象中的名称不是时 独特的,接收这样的对象的软件的行为是 不可预知的。
  10. 示例(来自RFC的第12页)

    这是一个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]
              }
          }
    

    其Image成员是对象,其缩略图成员是对象, 其ID成员是一个数字数组。

  11.   

    实际上没有" JSON对象"。

    <强>真的吗

答案 5 :(得分:1)

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

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

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

基本上,我上面例子中的newObject是一个使用JavaScript Objeect Notation定义的对象;但它不是“有效的”JSON对象,因为它不符合JSON标准要求的规则。

此链接也非常有用: http://msdn.microsoft.com/en-us/library/bb299886.aspx

答案 6 :(得分:0)

首先你应该知道JSON是什么:

它是与语言无关的数据交换格式。 JSON的语法受JavaScript Object Literal表示法的启发,但它们之间存在差异。

例如,在JSON中,必须引用所有键,而在对象文字中,这不是必需的:

// JSON: {&#34; foo&#34;:&#34; bar&#34; }

//对象文字: var o = {foo:&#34; bar&#34; }; 引号在JSON上是必需的,因为在JavaScript中(更准确地说,在ECMAScript 3rd。版本中),不允许使用保留字作为属性名称,例如:

var o = {if:&#34; foo&#34; }; // ES3中的SyntaxError 而使用字符串文字作为属性名称(引用属性名称)不会产生任何问题:

var o = {&#34; if&#34;:&#34; foo&#34; }; 所以对于&#34;兼容性&#34; (并且易于评估?)引号是强制性的。

JSON中的数据类型也限制为以下值:

的字符串 数 宾语 排列 文字为: 真正 假 空值 字符串的语法会发生变化。它们必须用双引号分隔,而在JavaScript中,您可以互换使用单引号或双引号。

//无效的JSON: {&#34; foo&#34;:&#39; bar&#39; } 接受的JSON语法也会发生变化,在JavaScript中你可以使用Hexadecimal Literals,例如0xFF,或者(臭名昭着的)Octal Literals,例如: 010.在JSON中,您只能使用十进制文字。

//无效的JSON: {&#34; foo&#34;:0xFF}

答案 7 :(得分:0)

Javascript对象文字与JSON:

  • 对象文字语法是创建javascript对象的一种非常方便的方法
  • JSON语言代表“ Java语言对象符号”,其语法派生自Javascript对象文字语法。它用作独立于编程语言的文本数据传输格式。

示例:

JS对象表示法,在JS中用于方便地在代码中创建对象:

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
}

JSON示例:

{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",
        "name": "main_window",
        "width": 500,
        "height": 500
    },
    "image": { 
        "src": "Images/Sun.png",
        "name": "sun1",
        "hOffset": 250,
        "vOffset": 250,
        "alignment": "center"
    },
    "text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",
        "name": "text1",
        "hOffset": 250,
        "vOffset": 100,
        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }
}}

主要区别:

  • JSON中的所有对象键必须为字符串。在Javascript对象中,键可以是字符串或数字

  • JSON中的所有字符串都必须用“双引号”引起来。而在Javascript中,单引号和双引号均允许。即使Javascript对象表示法中没有引号,对象键也会隐式转换为字符串。

  • 在JSON中,不能将函数定义为对象的值(因为它是Java特定的)。在Javascript中,这是完全合法的。

内置于JSON对象中的Javascript:

使用Javascript在其运行时中提供的内置JSON对象,可以轻松将

JSON对象转换为Javascript,反之亦然。例如:

const Object = {
  property1: true,
  property2: false,
}; // creating object with JS object literal syntax

const JSON_object = JSON.stringify(Object);  // stringify JS object to a JSON string

console.log(JSON_object); // note that the (string) keys are in double quotes

const JS_object = JSON.parse(JSON_object);  // parse JSON string to JS object

console.log(JS_object.property1, JS_object.property2); 
// accessing keys of the newly created object

答案 8 :(得分:-1)

这是一个令人惊讶的区别:您不能在json中使用undefined,并且所有具有未定义值的对象字段都将在JSON.stringify之后消失

let object =  { "a": undefined } ;

let badJSON= '{ "a": undefined }';


console.log('valid JS object :', object );
console.log('JSON from object:', JSON.stringify(object) );
console.log('invalid json    :', JSON.parse(badJSON) );

???