有人能告诉我使用对象文字表示法定义的JavaScript对象和JSON对象的主要区别是什么吗?

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

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

为什么这里不是JSON对象?仅仅因为它不是用引号定义的吗?


当前回答

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

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

例如,在JSON中,所有的键都必须加引号,而在对象文字中则不需要这样做:

/ / JSON: {"foo": "bar"}

//对象文字: Var o = {foo: "bar"}; 引号在JSON中是强制的,因为在JavaScript中(更确切地说在ECMAScript 3rd中)。Edition),不允许使用保留字作为属性名,例如:

Var o = {if: "foo"};// ES3中的SyntaxError 然而,使用字符串文字作为属性名(引用属性名)没有问题:

Var o = {"if": "foo"}; 所以为了“兼容性”(和容易评估可能?)引号是强制性的。

JSON中的数据类型也仅限于以下值:

字符串 数量 对象 数组 字面意思为: 真正的 假 零 字符串的语法改变了。它们必须用双引号分隔,而在JavaScript中,可以交替使用单引号或双引号。

//无效JSON: {"foo": 'bar'} 数字的公认JSON语法也会发生变化,在JavaScript中,你可以使用十六进制文字,例如0xFF,或(臭名昭著的)八进制文字,例如010。在JSON中,你只能使用十进制文字。

//无效JSON: {"foo": 0xFF}

其他回答

对于那些仍然认为RFC比博客和基于观点的误解更重要的人,让我们试着澄清一些观点。 我不打算重复之前的答案中已经提到的所有正确的差异,这里我只是试图增加总结一些关键部分rfc7159的价值

摘自https://www.rfc-editor.org/rfc/rfc7159

JavaScript Object Notation (JSON) is a text format for the serialization of structured data. It is derived from the object literals of JavaScript, as defined in the ECMAScript Programming Language Standard, Third Edition [ECMA-262]. JSON can represent four primitive types (strings, numbers, booleans, and null) and two structured types (objects and arrays). An object is an unordered collection of zero or more name/value pairs, where a name is a string and a value is a string, number, boolean, null, object, or array. begin-object = ws %x7B ws ; { left curly bracket end-object = ws %x7D ws ; } right curly bracket A JSON value MUST be an object, array, number, or string, or one of the following three literal names: false null true An object structure is represented as a pair of curly brackets The names within an object SHOULD be unique. object = begin-object [ member *( value-separator member ) ] end-object An object whose names are all unique is interoperable in the sense that all software implementations receiving that object will agree on the name-value mappings. When the names within an object are not unique, the behavior of software that receives such an object is unpredictable. Examples (from page 12 of RFC) This is a JSON object:

{ "图像":{ “宽度”:800年, “高度”:600年, “标题”:“从15楼看”, “缩略图”:{ “Url”:“http://www.example.com/image/481989943”, “高度”:125年, “宽度”:100 }, "Animated": false, " id ": [116, 943, 234, 38793] } }

它的Image成员是一个对象,其Thumbnail成员是一个对象和 它的id成员是一个数字数组。

实际上没有所谓的“JSON对象”。

真的吗?

根据JavaScript中的JSON,

JSON是对象的子集 JavaScript的文字符号。

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

除了阅读文档(正如@Filix King所建议的),我还建议使用JSONLint在线JSON验证器。这就是为什么我知道JSON对象的键必须是字符串。

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

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

例如,在JSON中,所有的键都必须加引号,而在对象文字中则不需要这样做:

/ / JSON: {"foo": "bar"}

//对象文字: Var o = {foo: "bar"}; 引号在JSON中是强制的,因为在JavaScript中(更确切地说在ECMAScript 3rd中)。Edition),不允许使用保留字作为属性名,例如:

Var o = {if: "foo"};// ES3中的SyntaxError 然而,使用字符串文字作为属性名(引用属性名)没有问题:

Var o = {"if": "foo"}; 所以为了“兼容性”(和容易评估可能?)引号是强制性的。

JSON中的数据类型也仅限于以下值:

字符串 数量 对象 数组 字面意思为: 真正的 假 零 字符串的语法改变了。它们必须用双引号分隔,而在JavaScript中,可以交替使用单引号或双引号。

//无效JSON: {"foo": 'bar'} 数字的公认JSON语法也会发生变化,在JavaScript中,你可以使用十六进制文字,例如0xFF,或(臭名昭著的)八进制文字,例如010。在JSON中,你只能使用十进制文字。

//无效JSON: {"foo": 0xFF}

实际上没有所谓的“JSON对象”。

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

Furthermore, (side-rant...) when people talk about a "JSON Object", they almost always mean data that has the "curly-braces" at the top-level. This corresponds nicely to a javascript object. However, the JSON spec does not require that there be a single "curly-braces" object at the top-level of a JSON string. It is perfectly valid JSON to have a list at the top-level, or even to have just a single value. So, while every "JSON Object" corresponds to valid JSON, not all valid JSON strings correspond to what we would call a "JSON Object"! ( because the string could represent a list or an atomic value )

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

关键值必须加引号 字符串必须引用“而不是” 你有一个更有限的值范围(例如不允许函数)